首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@RunWith(SpringRunner.class) vs @RunWith(MockitoJUnitRunner.class)

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

Stack Overflow用户
提问于 2018-04-03 16:54:39
回答 5查看 65.1K关注 0票数 54

我在用mockito进行junit测试时使用了@RunWith(MockitoJUnitRunner.class)。但现在我正在使用spring引导应用程序,并尝试使用@RunWith(SpringRunner.class)。使用@RunWith(SpringRunner.class)比使用@RunWith(MockitoJUnitRunner.class)有什么优势吗?我还可以使用像@Injectmock@Mock@Spy@RunWith(SpringRunner.class)这样的特性吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-04-04 09:31:19

SpringRunner提供了对加载Spring ApplicationContext和将beans @Autowired加载到测试实例的支持。实际上,它所做的远不止这些(在Spring参考手册中介绍过),但这是基本思想。

然而,MockitoJUnitRunner为使用Mockito创建模拟和间谍提供了支持。

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

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

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

例如,您可以使用Spring运行程序和Mockito规则,如下所示。

代码语言:javascript
复制
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTests {

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

    @Mock
    MyService myService;

    // ...
}

不过,通常情况下,如果您使用Spring,并且需要模拟SpringApplicationContext中的bean,那么您将使用Spring的@MockBean支持,而不是简单的@Mock

票数 53
EN

Stack Overflow用户

发布于 2018-04-04 06:54:52

当使用SpringRunner.class时,Spring提供了相应的注释:

  • @MockBean
  • @SpyBean

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

  • @SpringBootTest

  • @TestExecutionListeners(MockitoTestExecutionListener.class)

更多细节和示例可以在官方文档中找到:嘲笑和监视豆子

票数 15
EN

Stack Overflow用户

发布于 2018-11-09 10:33:52

根据JavaDoc:

SpringRunner是SpringJUnit4ClassRunner的别名。要使用这个类,只需用JUnit 4用@RunWith(SpringRunner.class)注释一个基于@RunWith(SpringRunner.class)的测试类。如果您想在运行程序之外的运行程序中使用SpringTestContext框架,请使用org.springframework.test.context.junit4.rules.SpringClassRuleorg.springframework.test.context.junit4.rules.SpringMethodRule

和JavaDoc of TestContext

TestContext封装了执行测试的上下文,不知道实际使用的测试框架。

方法getApplicationContext()的方法

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

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

但是,这已经是一个集成或组件测试。如果您的测试是纯单元测试,则不需要加载DB,或者只需要验证某个依赖项的方法是否被调用,MockitoJUnit4Runner就足够了。您只需根据自己的喜好使用@MockMockito.verify(...),测试就会通过。而且要快得多。

测试应该很快。尽可能快。因此,只要有可能,就使用MockitoJUnit4Runner来加快速度。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49635396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档