为什么这个 JMock 测试失败了?
Why this JMock test is failing?
class个结构如下:
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")。
- 那个方法 returns,然后测试检查 "a" 是否调用了
send
-- 它没有,因为 EmailClient 不知道它。
与其在 EmailAgent.sendNote
中创建发件人,不如在 EmailAgent 中创建一个构造函数,该构造函数接受发件人并将其存储在实例字段中,然后在 sendNote
中使用该字段。然后,测试将其模拟发件人传递给 EmailAgent。
class个结构如下:
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")。 - 那个方法 returns,然后测试检查 "a" 是否调用了
send
-- 它没有,因为 EmailClient 不知道它。
与其在 EmailAgent.sendNote
中创建发件人,不如在 EmailAgent 中创建一个构造函数,该构造函数接受发件人并将其存储在实例字段中,然后在 sendNote
中使用该字段。然后,测试将其模拟发件人传递给 EmailAgent。