类结构如下:
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()
从未被调用。这怎么可能?
最佳答案
EmailAgent 不使用从任何地方获取的发件人;它创造了自己的。所以:
- 我的测试创建了一个模拟的发送者(称之为“a”)。
- 然后调用
sendNote
,创建第二个发送者(称之为“b”)。 - 该方法返回,然后测试检查“a”是否已调用
send
- 但它没有调用,因为 EmailClient 并不知道这一点。
您应该在 EmailAgent 中创建一个构造函数,该构造函数接受 Sender 并将其存储在实例字段中,然后在 sendNote< 中使用该字段,而不是在
。然后,测试将其模拟的发件人传递给 EmailAgent。EmailAgent.sendNote
中创建 Sender/
关于java - 为什么这个 JMock 测试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35421807/