私は現在、特定の状況で特定のクラスのコード カバレッジをCoberturaが認識しないことに苦労しています。クラスは完全にテストされていますが (メソッド カバレッジ 100%)、Cobertura は 0% のカバレッジを表示します。
同じパッケージには、適切なコード カバレッジ結果を取得する他のクラスもあるため、この場合、間違った除外パターンは問題になりません。
テストするクラスは次のようになります。
@Service
public class CacheEnabledService {
@Autowired
private UserRepository userRepository;
@Cacheable(value="users",key="#root.methodName")
public List<User> findAllUser() {
return userRepository.findAll();
}
}
テスト自体:
@DirtiesContext
@ContextConfiguration(classes = {TestConfig.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class CacheEnabledServiceTest {
@Autowired
private CacheEnabledService cacheEnabledService;
@Test
public void testCachedRepoisotryFindAll(){
UserRepository mockedRepository = Mockito.mock(UserRepository.class);
cacheEnabledService.setUserRepository(mockedRepository);
Mockito.when(mockedRepository.findAll()).thenReturn(Lists.<User>newArrayList(new User()));
List<User> allExpandables1 = cacheEnabledService.findAllUser();
List<User> allExpandables2 = cacheEnabledService.findAllUser();
assertEquals(1, allExpandables1.size());
assertEquals(allExpandables1.size(), allExpandables2.size());
assertSame(allExpandables1.get(0), allExpandables2.get(0));
Mockito.verify(mockedRepository, VerificationModeFactory.times(1)).findAll();
Mockito.verifyNoMoreInteractions(mockedRepository);
}
}
これまでの私の唯一の仮定は、Springs のプロキシおよび/またはキャッシュ メカニズムのいずれかが Coberturas のインストルメンテーションに干渉する可能性があるということでした。
この問題を解決する方法のヒントは大歓迎です。前もって感謝します。
更新: サービス クラスにインターフェイスを追加すると、問題が修正されました。欠落しているインターフェースは Spring によって正しく処理されますが、これを実現するには CGLIB 操作が必要です。私の場合、CGLIB によるこれらの再マッピングは、Cobertura を打ち負かしました。したがって、再マッピングの問題がある場合は、Spring サービスがインターフェースを使用しているかどうかを常に確認してください。