【发布时间】:2020-03-02 13:26:56
【问题描述】:
我正在为一个从 Kafka 获取某些对象、验证它们、执行各种转换并将转换后的对象保存到另一个数据库或将错误响应发送回 Kafka 的应用程序编写集成测试。
生产数据库有几个命名查询,这些查询映射到相应 JpaRepository 中的相关方法,如下所示:
public interface PositionRepository extends JpaRepository<Position, Long> {
@Procedure(name = "generatePositionCode")
void generatePositionCode(@Param("clientCode") Integer clientCode);
//remainder omitted
我正在使用 Mockito 框架和 H2 内存数据库进行集成测试。由于测试数据库不包含此类命名查询,我想存根存储库中的相应方法,并且在调用它们时什么都不做(这对于测试目的是可以的),但继续调用存储库的其他非存根方法。
我一直认为这是你应该在 Mockito 中使用间谍的时候。但是,当我这样定义间谍时:
@Spy
private PositionRespository positionRepository;
public void setUp() {
doNothing().when(positionRepository).generatePositionCode(anyInt());
}
我的集成测试失败,异常归结为:
原因:org.h2.jdbc.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());
}
所有测试都是绿色的。
我一直试图弄清楚为什么这两种方法会产生不同的结果但不能。任何人都可以解释一下吗?
谢谢。
【问题讨论】:
标签: mocking mockito integration-testing spy