В настоящее время я борюсь с тем, что 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 интерфейс, если у вас есть проблемы с повторным сопоставлением.
cacheEnabledService.getClass().getName()
или проверите, еслиcacheEnabledService.getClass() == CacheEnabledService.class
Я подозреваю, что вы обнаружите, что они не являются одним и тем же классом... и поскольку Cobertura отслеживает классы, для которых вызываются методы, это может объяснить, почему вы видите покрытие, которое вы видите. - person Stephen Connolly   schedule 06.09.2013