防止在 JUnit 中执行 jpa @Query
Prevent executing jpa @Query in JUnit
我有一个 Spring 引导项目(版本 2.3。1.RELEASE),我正在尝试编写不使用数据库的 JUnit 测试(全部模拟)。
为此我配置了一个junit环境H2作为数据库
spring.datasource.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.datasource.url=jdbc:h2:mem:db;TRACE_LEVEL_FIlE=4
spring.datasource.username=sa
spring.datasource.password=
还有这个非常常规的存储库
public interface AccountRepository extends JpaRepository<Account, Long> {
@Query("SELECT A FROM Account A WHERE "
+ "A.state='PENDING' AND "
+ "P.origin='WS' AND "
+ "UPPER(P.type)='R'")
public List<Account> pending();
}
我的测试控制器以
开头
@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = LoadBranchesController.class)
@ComponentScan(basePackages = { Constant.ROOT_PACKAGE })
@TestPropertySource(locations = "classpath:application-junit.properties")
class LoadBranchesControllerTest {
当我在 junit 测试中 运行 ControllerTests 时,我的问题就来了。在 bootstrap 上,它抱怨:
2020-10-20 20:37:38 WARN - WARN - org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 42102, SQLState: 42S02
2020-10-20 20:37:38 ERROR - ERROR - org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Table "AP_ACCOUNTS" not found; SQL statement:
发生这种情况是因为他正在尝试检查此查询。但是 H2 是空的(我想要的方式)。
有没有办法在 bootstrap 时禁用 JpaRepositories 的查询执行?
解决方案有两条腿,应用于每个测试class:
- 在 ComponentScan 中,必须排除存储库
@ComponentScan(Constant.ROOT_PACKAGE + ".helper")
因此,所有带有@Query 的Bean,必须在所有扫描的组件之外
- 任何时候自动装配存储库的组件都必须被模拟,即使它们没有被使用
@MockBean
private AccountRepository accountRepositoryMock;
我有一个 Spring 引导项目(版本 2.3。1.RELEASE),我正在尝试编写不使用数据库的 JUnit 测试(全部模拟)。
为此我配置了一个junit环境H2作为数据库
spring.datasource.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.datasource.url=jdbc:h2:mem:db;TRACE_LEVEL_FIlE=4
spring.datasource.username=sa
spring.datasource.password=
还有这个非常常规的存储库
public interface AccountRepository extends JpaRepository<Account, Long> {
@Query("SELECT A FROM Account A WHERE "
+ "A.state='PENDING' AND "
+ "P.origin='WS' AND "
+ "UPPER(P.type)='R'")
public List<Account> pending();
}
我的测试控制器以
开头@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = LoadBranchesController.class)
@ComponentScan(basePackages = { Constant.ROOT_PACKAGE })
@TestPropertySource(locations = "classpath:application-junit.properties")
class LoadBranchesControllerTest {
当我在 junit 测试中 运行 ControllerTests 时,我的问题就来了。在 bootstrap 上,它抱怨:
2020-10-20 20:37:38 WARN - WARN - org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 42102, SQLState: 42S02
2020-10-20 20:37:38 ERROR - ERROR - org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Table "AP_ACCOUNTS" not found; SQL statement:
发生这种情况是因为他正在尝试检查此查询。但是 H2 是空的(我想要的方式)。
有没有办法在 bootstrap 时禁用 JpaRepositories 的查询执行?
解决方案有两条腿,应用于每个测试class:
- 在 ComponentScan 中,必须排除存储库
@ComponentScan(Constant.ROOT_PACKAGE + ".helper")
因此,所有带有@Query 的Bean,必须在所有扫描的组件之外
- 任何时候自动装配存储库的组件都必须被模拟,即使它们没有被使用
@MockBean
private AccountRepository accountRepositoryMock;