我有这个使用以下内容的sprig boot(版本1.5.6)应用程序:
现在,我正在为此应用程序创建单元测试。在一个测试用例中,我有以下注释:
@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
我尝试了多项尚未解决的问题:
我在上下文初始化时看到以下内容:
.s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
既然spring能够在第一次测试中自动装配jpa存储库并且它在应用程序中工作正常,我认为它应该能够在webMvc测试用例中自动装配存储库。
我可以创建一个配置文件并初始化测试包中的实体管理器,数据源等,但如果有办法用spring自动装配东西,那么我不想管理那个配置。
请建议。
答案 0 :(得分:4)
我看到你有@WebMvcTest
注释。特定的一个是仅测试Web层,它不加载整个应用程序上下文,只加载Web上下文。您可能需要切换到@SpringBootTest
和@AutoConfigureMockMvc
来测试整个堆栈。
使用Spring Boot进行JPA测试的方式是使用@DataJpaTest
注释。它会自动配置所有内容,前提是您在类路径中有一个内存中的数据库(如果您使用maven,请确保它在“测试”范围内)。它还提供了TestEntityManager
,它是JPA EntityManager
接口的一个实现,具有一些有用的测试功能。
示例:
@RunWith(SpringRunner.class)
@DataJpaTest
pubic class EntityTest {
@Autowired TestEntityManager entityManager;
@Test
public void saveShouldPersistData() throws Exception {
User saved = entityManager.persistFlushFind(new User("username", "password"));
assertNonNull(saved);
}
}
在你的pom.xml中你可以添加H2数据库(Spring Boot也可以自动配置Derby和HSQLDB)
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>