问题描述
我有以下2种逻辑,并且两种逻辑都针对相同的测试进行了测试,但是使用Streams实现的一种逻辑产生80%的代码覆盖率问题,而使用for循环的一种逻辑则没有代码覆盖率问题。关于这种情况,我能得到一些建议吗?谢谢。
这没有代码覆盖问题
public static Map<String,String> myMethod(List<KafkaHeader> headers) {
Map<String,String> map = new HashMap<>();
for(KafkaHeader header : headers) {
map.put(header.key(),String.valueOf(header.value()));
}
return map;
}
按以下方式使用Stream时,存在覆盖问题。
public static Map<String,String> myMethod(List<KafkaHeader> headers) {
return headers.stream()
.collect(Collectors.toMap(KafkaHeader::key,kafkaHeader -> String.valueOf(kafkaHeader.value())));
}
测试用例:
@Test
public void simpletest() {
List<KafkaHeader> headers = new ArrayList<>();
for (int i = 0; i < 10; i++) {
headers.add(new KafkaHeader("key"+i,"value"+i));
}
Map<String,String> headerMap = myclass.myMethod(headers);
for (int i = 0; i < 10; i++) {
assertEquals(headerMap.get("key"+i),"value"+i);
}
}
注意:KafkaHeader是一个外部类。
解决方法
如方法1和方法2的屏幕截图所示,两种方法的覆盖率均为100%。。
我在这里使用 JUnit4ClassRunner
和 JACOCO
进行覆盖。
对我来说很好。
@RunWith(JUnit4ClassRunner.class)
public class SampleTest {
@Test
public void sample() {
SampleJava.myMethod(List.of(KafkaHeader.builder().key("key").value("val").build()));
SampleJava.myMethod1(List.of(KafkaHeader.builder().key("key").value("val").build()));
}
}