我有这个使用以下内容的sprig boot(版本1.5.6)应用程序:
-
spring boot starter data jpa(jpa存储库和实体)
-
spring boot starter数据gemfire(没有存储库或实体)
-
spring boot starter数据休息(用于HAL支持)
现在,我正在为这个应用程序创建单元测试 . 在一个测试用例中,我有以下注释:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = { "spring.cloud.enabled=false" })
该测试正确初始化了jpa存储库,我可以测试它 .
然后我有另一个带有以下注释的测试:
@RunWith(SpringRunner.class)
@WebMvcTest(MyRestController.class)
此测试设置Mockmvc,但它不初始化JPA存储库 . 它只初始化配置的MVC部分 . 但是我也需要初始化JPA存储库 . 我有data.sql文件的测试数据设置,它作为内存H2数据库加载 . 我得到的错误是:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
我尝试了多项没有解决的问题:
-
使用两个注释都不起作用,因为该类只能有一个"BootstrapWith"注释 .
-
@EnableJpaRepositories不起作用
-
@AutoConfigureTestDatabase不起作用
在上下文初始化时我确实看到以下内容:
.s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
现在,因为spring能够在第一次测试中自动装配jpa存储库并且它在应用程序中工作正常,我认为它应该能够在webMvc测试用例中自动装配存储库 .
我可以创建一个配置文件并初始化测试包中的实体管理器,数据源等,但是如果有办法用spring自动装配东西,那么我不想管理那个配置 .
请建议 .
1 回答
我看到你有
@WebMvcTest
注释 . 特定的一个是仅测试Web层,它不加载整个应用程序上下文,只加载Web上下文 . 您可能需要切换到@SpringBootTest
和@AutoConfigureMockMvc
来测试整个堆栈 .使用Spring Boot进行JPA测试的方式是使用
@DataJpaTest
注释 . 它会自动配置所有内容,前提是您在类路径中有内存中的数据库(如果使用maven,请确保它位于"testing"范围内) . 它还提供了TestEntityManager
,它是JPA的EntityManager
接口的一个实现,具有一些有用的测试功能 .例:
在你的pom.xml中你可以添加H2数据库(Spring Boot也可以自动配置Derby和HSQLDB)