0
public interface MessageProducer {
    public void produce(String message);
    public Map<String, Set<String>> getMessagesMapped();
} 

public MessageProducerImpl {
   @Override
   public void produce(String message) {
       //code logic here calls private class methods to manipulate messages
   }

@Override
public Map<String, Set<String>> getMessagesMapped() {
    return map;
}
}

在以下情况下,应该如何测试上述场景并确保良好的测试覆盖率:

  • 入口点produce()不遵守接口定义的合同,并且没有返回类型。
  • 其他方法privateMessageProducerImpl类中
  • 不允许更改界面
4

1 回答 1

1

你不测试接口,你测试实现。接口可能太通用而无法测试。

即使它是一个 void 方法,它也应该做一些事情。写入文件,更新缓存,任何事情。由于它是一种 void 方法,因此它应该有副作用。(如果不是,它可以被删除,对吧?)

所以,测试结果,因为显然,副作用是合同的一部分(因此,应该测试)。

在您的示例代码中,您有一个有状态的对象(通常不推荐,除非它是一个普通值对象/DTO),因此您只能将其作为一个整体进行测试,因为它依赖于状态。(例如,考虑它有一个影响produce()方法逻辑的额外方法)

所以测试至少包括这两种方法
对于您的示例代码,示例测试:

@Test public void myTest() {
    MessageProducerImpl underTest = new MessageProducerImpl();
    String sampleInputString = ....; // a sample string, from which the expected result is that it's split in 4 keys
    underTest.produce(sampleInputString);
    Map<String, Set<String>> result = underTest.getMessagesMapped();
    assertEquals(4, result.size());
}

然后,您的代码覆盖率工具应将其标记为绿色。

于 2016-07-01T14:17:01.227 回答