当前位置: 首页 > 知识库问答 >
问题:

Spring Boot单元测试——测试失败,抱怨没有定义“entitymanager factory”bean

柴禄
2023-03-14

我正在尝试为 Spring 启动应用程序中的控制器编写单元测试。该应用程序运行顺利,我的问题是运行其测试。

下面是测试代码

@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.

这对我来说感觉很奇怪,因为我提供了AutoCon


共有3个答案

慕永年
2023-03-14

Spring 引导正在加载应用程序的配置,导致数据层被初始化。

摘自Spring Boot的文档,检测测试配置:

Spring Boot的@*测试注释会在您没有显式定义主配置时自动搜索主配置。

搜索算法从包含测试的包开始工作,直到找到用 @SpringBootApplication 或 @SpringBootConfiguration 批注的类。只要您以合理的方式构建代码,通常会找到您的主要配置。

当扫描到达您的main类时,它可能会找到一个注释,例如@EnableJpaRepository,它初始化您的数据层,因此需要实体管理器工厂。(您可能还会看到其他副作用,例如HiberNate初始化您的内存数据库,如果您的应用程序使用的话。)

正如其他答案所建议的,您可以初始化数据层,或者尝试连接/模拟丢失的bean。但由于您没有在这里测试数据层,所以最好控制测试的配置。

文档提出了一些解决方案:

> < li>

将< code > @ EnableJpaRepositories 从主类移到子包中的配置类。它将被应用程序扫描(从顶层包开始),但不会被单元测试扫描。这将在用户配置和切片一节中讨论。

添加一个嵌套的< code>@Configuration类来重写单元测试使用的配置。

总的来说,第一条似乎是一条好规则。其他注释(如@EnableBatchProcessing@EnableScheduling)可以以相同的方式处理,这将加快单元测试的速度。

江煜
2023-03-14
匿名用户

在您的< code>mockito测试类中注入Spring的< code>TestEntityManager。

@Autowired
private TestEntityManager entityManager;

您已经在测试类上使用< code > @ AutoConfigureTestEntityManager 来自动配置此测试实体管理器。因此您不必在配置文件中做任何其他事情。

慕弘伟
2023-03-14

如果 Google 将您带到这里并且您使用的是 Spring Boot,您可能需要将@DataJpaTest添加到您的测试类中。它位于org.springframework.boot:spring-boot-test-autoconfigure中。在重新运行时,您可能还会发现您需要在 org.hibernate:hibernate-validator 上声明依赖项。

 类似资料:
  • 我正在尝试为一个Spring Boot应用程序中的控制器编写一个单元测试。应用程序运行平稳,我的问题是运行它的测试。 下面是测试代码: 当我尝试运行它时,我得到: 这对我来说很奇怪,因为我提供了注释,并且希望所有与相关的内容都已经到位。

  • 在使用maven运行单元测试时,我遇到了这个异常。我的所有测试都没有执行。我的测试类的格式是 我正在运行以下命令来运行此命令: 使用的surefire插件是: 有人知道为什么我的测试没有执行吗?我用的是jUnit 4.8.2和surefire 2.14.1

  • 我正在尝试在Windows 8 Professional(64位)笔记本电脑上安装TestCular(使用nmp),但在尝试安装socket.io(作为此过程的一部分)时失败。我得到的错误是 我显然有。NET框架3.5安装(它在控制面板中的添加/删除Windows组件位下检查),尽管我没有设法找到vcbuild.exe.我尝试安装VS2005的旧副本,但这导致了一个关于无效项目的不同错误(. vc

  • 我不熟悉匕首。我创建了一个非常简单的单元测试,试图理解我应该如何使用dagger。不幸的是,它失败了。我可能还不了解匕首的一些基本原理。 而我的测试课失败了 我认为dagger会将B注入A,因为A希望注入B,DaggerModule包含一个@Providers注释方法,该方法创建B。 更新: 我发现当我像这样编写模块类时 将B注入A作品中。然而,我不理解为什么当模块有一个构造a实例的带注释的方法时

  • 问题内容: 有没有办法在单元测试失败时自动启动调试器? 现在,我只是手动使用pdb.set_trace(),但这非常繁琐,因为我需要每次都添加它并在最后将其取出。 例如: 问题答案: 我更正了在异常而不是set_trace上调用post_mortem的代码。

  • Android Studio 1.1 添加了单元测试支持,详细请看 Unit testing support。本章的其余部分描述的是 “instrumentation tests”。利用 Instrumentation 测试框架可以构建独立的测试 APK 并运行在真实设备(或模拟器)中进行测试。