Я пишу интеграционные тесты для приложения, которое получает определенные объекты от Kafka, проверяет их, выполняет различные преобразования и либо сохраняет преобразованные объекты в другую базу данных, либо отправляет ответ с ошибками обратно в Kafka.
В производственной базе данных есть несколько именованных запросов, которые отображаются на соответствующие методы в соответствующем JpaRepository
, например:
public interface PositionRepository extends JpaRepository<Position, Long> {
@Procedure(name = "generatePositionCode")
void generatePositionCode(@Param("clientCode") Integer clientCode);
//remainder omitted
Я использую инфраструктуру Mockito и базу данных H2 в памяти для интеграционного тестирования. Поскольку тестовая база данных не содержит таких именованных запросов, я хочу заглушить соответствующие методы в хранилище и ничего не делать, когда они вызываются (это нормально для целей тестирования), но продолжать вызывать другие непустые методы хранилища.
Я всегда думал, что это когда вы должны использовать шпиона в Мокито. Однако, когда я определяю шпиона следующим образом:
@Spy
private PositionRespository positionRepository;
public void setUp() {
doNothing().when(positionRepository).generatePositionCode(anyInt());
}
, мои интеграционные тесты не выполняются с исключением, которое сводится к:
Причина: org.h2.jdb c .JdbcSQLException: база данных "FT" не найдена; SQL оператор: вызов FT.Ftposgn.generatePositionCode (?) [90013-197]
Если, с другой стороны, я определяю макет с делегированием в классе конфигурации следующим образом:
@Primary
@Bean
public PositionRepository mockPositionRepository(PositionRepository positionRepository) {
return Mockito.mock(PositionRepository.class,
AdditionalAnswers.delegatesTo(positionRepository));
}
и автоматическое подключение хранилища в классе тестирования:
@Autowired
private PositionRepository positionRepository;
public void setUp() {
doNothing().when(positionRepository).generatePositionCode(anyInt());
}
все тесты зеленого цвета.
Я пытался обернуть голову, почему эти два метода дают другие результаты, но не могли. Кто-нибудь может пролить немного света?
Спасибо.