2016-02-16 166 views
0

类结构如下:为什么这个JMock测试失败?

public interface Sender { 
    void send(String note); 
} 

public interface Agent { 
    void sendNote(String note); 
} 

public class Emailer implements Sender { 
    void send(String note) { 
     //...do something 
    } 
} 

public class EmailAgent implements Agent { 
    void sendNote(String note) { 
     Sender sender = new Emailer(); 
     sender.send(); 
    } 
} 

我已经实现了我的JMock的/ JUnit测试是这样的:

@Rule 
public JUnitRuleMockery context = new JUnitRuleMockery(); 

Sender sender = context.mock(Sender.class); 

@Test 
public void test1() { 
    context.checking(new Expectations() {{ 
     exactly(1).of(sender).send("test"); 
    }}); 

    new EmailAgent().sendNote("test"); 
} 

由于种种原因,因为它说sender.send()则永远不会调用上面的失败。这怎么可能?

+0

你的'新的EmailClient()'对于模拟'sender'对象一无所知。如果你将它传递给方法,无论是通过构造函数还是方法本身,它都会像你想要的那样工作。相反,您正在测试类中创建模拟'sender',而在'test1'方法中创建另一个模拟器。 –

回答

1

EmailAgent不使用从任何地方获取的发件人;它创建它自己的。所以:

  • 如果测试创建了一个模拟发件人(称之为“a”)。
  • 然后调用sendNote,创建第二个发件人(称之为“b”)。
  • 该方法返回,然后测试检查“a”已调用send - 它没有,因为EmailClient不知道它。

,而不是在EmailAgent.sendNote创建发件人,你应该建立在EmailAgent一个构造函数发送者并将其存储在一个实例字段,然后使用在sendNote这一领域。然后,测试将其模拟的发件人传递给EmailAgent。