【问题标题】:how to ensure good test-coverage with void methods [duplicate]如何使用 void 方法确保良好的测试覆盖率[重复]
【发布时间】:2016-07-01 14:08:45
【问题描述】:
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
  • 不允许更改界面

【问题讨论】:

    标签: java oop junit test-coverage


    【解决方案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());
    }
    

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

    【讨论】:

    • 在测试类中,我正在调用实现的produce() 方法,它构建一个映射,然后测试映射键/值?但这会将测试覆盖范围内的红色标记为行和方法的 0%。
    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2022-11-11
    • 2017-10-14
    相关资源
    最近更新 更多