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()
无效,符合接口定义的合同,且没有返回类型。private
类MessageProducerImpl
答案 0 :(得分:1)
您不测试界面,您测试实现。界面可能太通用而无法测试。
即使它是一种无效方法,它也应该做点什么。写入文件,更新缓存,任何东西。由于它是一种无效方法,它应该有副作用。 (如果不是,可以将其删除,对吗?)
因此,测试结果,因为显然,副作用是合同的一部分(因此,应该进行测试)。
在您的示例代码中,您有一个有状态对象(通常不推荐,除非它是一个普通值对象/ 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());
}
您的代码覆盖率工具应将其标记为绿色。