为什么这个JMock测试失败了?

时间:2016-02-16 00:53:05

标签: java 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()。这怎么可能?

1 个答案:

答案 0 :(得分:1)

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

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

您应该在EmailAgent中创建一个构造函数,该构造函数接收发件人并将其存储在实例字段中,然后在EmailAgent.sendNote中使用该字段,而不是在sendNote中创建发件人。然后,测试将其模拟的发件人传递给EmailAgent。