java - 为什么这个 JMock 测试失败?

标签 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() 从未被调用。这怎么可能?

最佳答案

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

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

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

关于java - 为什么这个 JMock 测试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35421807/

相关文章:

java - 如何从 firebase 实时数据库中重新排序数据

java - 如何模拟 JdbcTemplate.queryForObject() 方法

junit - 手动 AtUnit 与 'Junit,JMock and GUICE' -?

java - 导入 rt.jar 给我 dalvik 错误

java - 检查 JSON 中包含键并检查 null/empty 的最佳实践?

java - 使用@Suite Junit 时将忽略 CucumberOptions 标签

java - Jmock意外的方法调用,看不出原因

java - 需要帮助编写测试

java - 我可以模拟父类(super class)方法调用吗?

java - 哪个更快?