我正在尝试为 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
Spring 引导正在加载应用程序的配置,导致数据层被初始化。
摘自Spring Boot的文档,检测测试配置:
Spring Boot的@*测试注释会在您没有显式定义主配置时自动搜索主配置。
搜索算法从包含测试的包开始工作,直到找到用 @SpringBootApplication 或 @SpringBootConfiguration 批注的类。只要您以合理的方式构建代码,通常会找到您的主要配置。
当扫描到达您的main
类时,它可能会找到一个注释,例如@EnableJpaRepository
,它初始化您的数据层,因此需要实体管理器工厂。(您可能还会看到其他副作用,例如HiberNate初始化您的内存数据库,如果您的应用程序使用的话。)
正如其他答案所建议的,您可以初始化数据层,或者尝试连接/模拟丢失的bean。但由于您没有在这里测试数据层,所以最好控制测试的配置。
文档提出了一些解决方案:
> < li>
将< code > @ EnableJpaRepositories 从主类移到子包中的配置类。它将被应用程序扫描(从顶层包开始),但不会被单元测试扫描。这将在用户配置和切片一节中讨论。
添加一个嵌套的< code>@Configuration类来重写单元测试使用的配置。
总的来说,第一条似乎是一条好规则。其他注释(如@EnableBatchProcessing
和@EnableScheduling
)可以以相同的方式处理,这将加快单元测试的速度。
在您的< code>mockito测试类中注入Spring的< code>TestEntityManager。
@Autowired
private TestEntityManager entityManager;
您已经在测试类上使用< code > @ AutoConfigureTestEntityManager 来自动配置此测试实体管理器。因此您不必在配置文件中做任何其他事情。
如果 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 并运行在真实设备(或模拟器)中进行测试。