我正在使用@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.
根据 JavaDoc:
SpringRunner 是
SpringJUnit4ClassRunner. 要使用这个类,只需用@RunWith(SpringRunner.class). 如果您想将 SpringTestContextFramework 与除此之外的运行器一起使用,请使用org.springframework.test.context.junit4.rules.SpringClassRule和org.springframework.test.context.junit4.rules.SpringMethodRule。
和 JavaDoc TestContext:
TestContext封装了执行测试的上下文,与正在使用的实际测试框架无关。
方法getApplicationContext():
获取此测试上下文的应用程序上下文,可能已缓存。如果相应的上下文尚未加载,则此方法的实现负责加载应用程序上下文,也可能缓存上下文。
因此,SpringRunner 确实加载了上下文并负责维护它。例如,如果要将数据持久化到嵌入式数据库(如 H2 内存数据库)中,则必须使用SpringRunner.class; 并且,为了清理表格以删除您在每次测试后插入的记录,您可以对测试进行注释@DirtiesContext以告诉 Spring 清理它。
但是,这已经是一个集成或组件测试。如果您的测试是纯单元测试,则不必加载数据库,或者您只想验证调用了依赖项的某些方法,MockitoJUnit4Runner就足够了。您只需随心所欲地使用@Mock,Mockito.verify(...)测试就会通过。它要快得多。
测试应该很快。尽可能快地。所以只要有可能,就用MockitoJUnit4Runner它来加快速度。