我正在尝试为一个Sping Boot 应用程序中的控制器编写一个单元测试。这个应用程序运行得很顺利,我的问题是运行它的测试。
下面是测试代码:
@RunWith(SpringRunner.class)
@WebMvcTest(MyController.class)
@AutoConfigureTestEntityManager
public class MyControllerTest {
@Autowired
private MockMvc mockMvc;
@Mock
private MyRepository myRepository;
@Mock
ZendeskNotifier zendeskNotifier;
@Mock
ActivityLogger activityLogger;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void cannotSendFooWithoutMessageBody() throws Exception {
this.mockMvc.perform(post("/api/v1/foo/1/send"))
.andDo(print())
.andExpect(status().is4xxClientError())
.andExpect(content().string(containsString("The message body cannot be empty.")));
}
}
当我试着运行它时,我得到:
***************************
APPLICATION FAILED TO START
***************************
Description:
Field jobEventRepository in foo.bar.util.memsource.svc.MemsourceEventProcessor required a bean named 'entityManagerFactory' that could not be found.
Action:
Consider defining a bean named 'entityManagerFactory' in your configuration.
这让我感觉很奇怪,因为我提供了AutoConfigureTestEntityManager
注解,并希望所有与EntityManager
相关的东西都在适当的位置。
6条答案
按热度按时间lawou6xi1#
我发现有一个注解可以用来将JPA支持添加到WebMVCTest**(@AutoConfigureDataJpa)**
fnatzsnv2#
如果你使用的是Sping Boot ,你可能需要在你的测试类中添加
@DataJpaTest
。它在org.springframework.boot:spring-boot-test-autoconfigure
中。你也可能在重新运行时发现你需要声明一个对org.hibernate:hibernate-validator
的依赖。hrysbysz3#
在
mockito
测试类中注入Spring的TestEntityManager
。您已经在测试类上使用
@AutoConfigureTestEntityManager
来自动配置此测试实体管理器。因此,您不必在配置文件中执行任何其他操作。p8ekf7hl4#
Sping Boot 正在加载应用程序的配置,导致数据层被初始化。
摘自Sping Boot 的文档,检测测试配置:
Sping Boot 的@*Test注解会自动搜寻您的主要设定,只要您没有明确定义。
搜索算法从包含测试的包开始,直到找到一个用@SpringBootApplication或@SpringBootConfiguration注解的类。只要你以合理的方式组织你的代码,你的主配置通常会被找到。
当扫描到
main
类时,很可能会找到@EnableJpaRepositories
之类的注解,它会初始化数据层,因此需要实体管理器工厂(您可能还会看到其他副作用,例如Hibernate会初始化内存中的数据库(如果应用程序使用该数据库))。正如其他答案所建议的,您可以初始化数据层,或者尝试连接/模拟缺少的bean。但是由于您在这里不是测试数据层,因此最好控制测试的配置。
这些文档提出了一些解决方案:
1.将
@EnableJpaRepositories
从主类移动到子包中的配置类。它将被应用程序扫描(从顶部包向下),而不是被单元测试扫描。这在用户配置和切片一节中讨论。1.加入巢状
@Configuration
类别,以覆写公寓测试所使用的组态。第一个规则似乎是一个很好的规则,其他注解,如
@EnableBatchProcessing
和@EnableScheduling
,也可以用同样的方法处理,这将加快单元测试的速度。ktecyv1j5#
您需要配置
entityManagerFactory
,可以参考下面的代码waxmsbnn6#
将@EnableJpaRepositories从主类移动到子包中的配置类。应用程序将扫描它(从顶层包向下),但单元测试不会扫描它。