我在用mockito进行junit测试时使用了@RunWith(MockitoJUnitRunner.class)。但现在我正在使用spring引导应用程序,并尝试使用@RunWith(SpringRunner.class)。使用@RunWith(SpringRunner.class)比使用@RunWith(MockitoJUnitRunner.class)有什么优势吗?我还可以使用像@Injectmock、@Mock、@Spy和@RunWith(SpringRunner.class)这样的特性吗?
发布于 2018-04-04 09:31:19
SpringRunner提供了对加载Spring ApplicationContext和将beans @Autowired加载到测试实例的支持。实际上,它所做的远不止这些(在Spring参考手册中介绍过),但这是基本思想。
然而,MockitoJUnitRunner为使用Mockito创建模拟和间谍提供了支持。
但是,使用JUnit 4,一次只能使用一个Runner。
因此,如果您想同时使用Spring和Mockito的支持,您只能选择其中的一个。
但是你很幸运,因为Spring和Mockito除了提供跑步规则之外,还提供了规则。
例如,您可以使用Spring运行程序和Mockito规则,如下所示。
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTests {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock
MyService myService;
// ...
}不过,通常情况下,如果您使用Spring,并且需要模拟SpringApplicationContext中的bean,那么您将使用Spring的@MockBean支持,而不是简单的@Mock。
发布于 2018-04-04 06:54:52
当使用SpringRunner.class时,Spring提供了相应的注释:
@MockBean@SpyBean通过@Autowired注释将模拟注入到测试下的对象。若要启用此功能,必须用
@SpringBootTest或
@TestExecutionListeners(MockitoTestExecutionListener.class)更多细节和示例可以在官方文档中找到:嘲笑和监视豆子
发布于 2018-11-09 10:33:52
根据JavaDoc:
SpringRunner是
SpringJUnit4ClassRunner的别名。要使用这个类,只需用JUnit 4用@RunWith(SpringRunner.class)注释一个基于@RunWith(SpringRunner.class)的测试类。如果您想在运行程序之外的运行程序中使用SpringTestContext框架,请使用org.springframework.test.context.junit4.rules.SpringClassRule和org.springframework.test.context.junit4.rules.SpringMethodRule。
和JavaDoc of TestContext
TestContext封装了执行测试的上下文,不知道实际使用的测试框架。
方法getApplicationContext()的方法
获取此测试上下文的应用程序上下文,可能是缓存的。如果尚未加载相应的上下文,则此方法的实现负责加载应用程序上下文,可能还会缓存上下文。
因此,SpringRunner确实加载了上下文并负责维护它。例如,如果您想要将数据持久化到嵌入式数据库中,如H2内存数据库,则必须使用SpringRunner.class;并且,要清理表以消除每次测试后插入的记录,您可以使用@DirtiesContext对测试进行注释,以告诉Spring清除它。
但是,这已经是一个集成或组件测试。如果您的测试是纯单元测试,则不需要加载DB,或者只需要验证某个依赖项的方法是否被调用,MockitoJUnit4Runner就足够了。您只需根据自己的喜好使用@Mock和Mockito.verify(...),测试就会通过。而且要快得多。
测试应该很快。尽可能快。因此,只要有可能,就使用MockitoJUnit4Runner来加快速度。
https://stackoverflow.com/questions/49635396
复制相似问题