@RunWith(SpringRunner.class)vs @RunWith(MockitoJUnitRunner.class)

21 junit spring-test mockito

我正在使用@RunWith(MockitoJUnitRunner.class)mockito进行junit测试.但现在我正在使用spring boot app并尝试使用@RunWith(SpringRunner.class).使用是否比使用@RunWith(SpringRunner.class)有任何优势@RunWith(MockitoJUnitRunner.class)?我仍然可以使用功能一样@Injectmock,@Mock,@Spy@RunWith(SpringRunner.class)

Sam*_*nen 32

SpringRunner提供了对加载Spring ApplicationContext和将bean添加@Autowired到测试实例的支持.它实际上做了很多(在Spring参考手册中有所介绍),但这是基本的想法.

然而,它MockitoJUnitRunner提供了与Mockito创建模拟和间谍的支持.

但是,使用JUnit 4,您一次只能使用一个Runner.

因此,如果您想同时使用Spring和Mockito的支持,您只能选择其中一个参赛者.

但是你很幸运,因为Spring和Mockito 除了跑步者之外还提供规则.

例如,您可以使用带有Mockito规则的Spring runner,如下所示.

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTests {

    @Rule
    public MockitoRule rule = MockitoJUnit.rule();

    @Mock
    MyService myService;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

虽然,通常情况下,如果您使用Spring Boot并且需要从Spring 模拟bean,那么ApplicationContext您将使用Spring Boot的@MockBean支持而不是简单的支持@Mock.

  • 使用`SpringClassRule`和`SpringMethodRule`:https://docs.spring.io/spring/docs/5.1.2.RELEASE/spring-framework-reference/testing.html#testcontext-junit4-rules (2认同)

VaL*_*VaL 5

SpringRunner.class使用时,弹簧提供对应的注释:

  • @MockBean
  • @SpyBean

通过@Autowired注释将模拟注入到测试中的对象。要启用此功能,必须在测试中添加注释

  • @SpringBootTest

要么

  • @TestExecutionListeners(MockitoTestExecutionListener.class)

可以在官方文档中找到更多详细信息和示例:模拟和间谍豆

  • 可以使用Autowired将@voipp模拟注入到测试对象中,但是MockBean用于定义要注入的模拟 (2认同)

Wes*_*Gun 5

根据 JavaDoc:

SpringRunner 是SpringJUnit4ClassRunner. 要使用这个类,只需用@RunWith(SpringRunner.class). 如果您想将 Spring TestContextFramework 与除此之外的运行器一起使用,请使用org.springframework.test.context.junit4.rules.SpringClassRuleorg.springframework.test.context.junit4.rules.SpringMethodRule

和 JavaDoc TestContext

TestContext 封装了执行测试的上下文,与正在使用的实际测试框架无关。

方法getApplicationContext()

获取此测试上下文的应用程序上下文,可能已缓存。如果相应的上下文尚未加载,则此方法的实现负责加载应用程序上下文,也可能缓存上下文。

因此,SpringRunner 确实加载了上下文并负责维护它。例如,如果要将数据持久化到嵌入式数据库(如 H2 内存数据库)中,则必须使用SpringRunner.class; 并且,为了清理表格以删除您在每次测试后插入的记录,您可以对测试进行注释@DirtiesContext以告诉 Spring 清理它。

但是,这已经是一个集成或组件测试。如果您的测试是纯单元测试,则不必加载数据库,或者您只想验证调用了依赖项的某些方法,MockitoJUnit4Runner就足够了。您只需随心所欲地使用@MockMockito.verify(...)测试就会通过。它要快得多。

测试应该很快。尽可能快地。所以只要有可能,就用MockitoJUnit4Runner它来加快速度。