仅在使用Stream时遇到代码覆盖问题

问题描述

我有以下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%。enter image description here

enter image description here

我在这里使用 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()));
    }
}