为什么这个 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。