Cobertura : how to cover spring-data @Repository i

2020-07-08 06:25发布

问题:

Regarding following information :

https://stackoverflow.com/a/14601831/704246

Cobertura does not instrument interfaces

I'd like to know how to add spring-data interfaces to coverage results, since @Repository implementation classes are only declared and instantiated by Spring at runtime.

Consider following interface :

// src/main/java/my/package/MyObjectRepository.java

@Repository
public interface MyObjectRepository  {
    MyObject findMyObjectByCodeAndName(String code, String name);
}

and following test :

// src/test/java/my/package/MyObjectRepositoryTest.java

// @RunWith(SpringJUnit4ClassRunner.class) + Spring configuration
public class MyObjectRepositoryTest {

    @Autowired
    private MyObjectRepository myObjectRepository;

    @Test
    public void myTest() {
        myObjectRepository.findMyObjectByCodeAndName("foo","bar");  
    }
}

I don't mind switching to Jacoco, but I've read that it doesn't instrument interfaces either.

How can following cases be covered ? The same issue/question occurs regarding Mybatis Mapper, which are declared as interfaces but no concrete Java class declaration implementing them is written by the developer but by the framework at runtime.

I've opened a ticket but I'm still waiting for an answer.

回答1:

If I understand correctly, an interface cannot be covered. Interfaces are just to define the contract, and contains no "runtime" commands. And code coverage tools only measure the lines that is reachable from the running tests. Say it other way, only field declaration, constructor or method body can be covered.

An exception may be Java8 interfaces that contains some default methods.