这是做什么的:@ RunWith(SpringJUnit4ClassRunner.class)

时间:2014-08-14 20:28:58

标签: spring junit

这个注释有什么作用?
 我什么时候想用呢?   我什么时候不想使用它?

@RunWith(SpringJUnit4ClassRunner.class)

我可以在Google上找到更多这方面的用法,并且没有找到关于这个注释应该与我沟通的内容或何时/为什么要使用它的101解释?

3 个答案:

答案 0 :(得分:11)

注释用于配置需要Spring依赖注入的单元测试。

来自Spring Reference - 10. Unit Testing

  

10.1创建单元测试类

     

为了使单元测试运行批处理作业,框架必须加载作业的ApplicationContext。两个注释用于触发:

     

@RunWith(SpringJUnit4ClassRunner.class):表示该类应该使用Spring的JUnit工具。

     

@ContextConfiguration(locations = {...}):指示哪些XML文件包含ApplicationContext。

答案 1 :(得分:2)

如果您使用的是注释而不是XML文件,那么需要进行Spring依赖注入的所有单元测试类都需要放入owner/repo-name/commits/sha-of-commit/filename 注释中。例如:

@ContextConfiguration

现在,当您在单元测试中使用 fooHarness 时,它将具有Spring上下文设置。因此,也会设置 fooHarness 注入的所有bean。

如果 fooHarness 注入的bean包含状态,那么您可能需要为每个测试重置这些bean的状态。在这种情况下,您可以将@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = FooHarness.class) class FooHarnessTest { @Autowired FooHarness fooHarness 批注添加到测试类:

@DirtiesContext

如果 fooHarness 或其任何注入的bean读取Spring配置,那么您需要在@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) 批注中添加 initializers 列表,其中包含< em> ConfigFileApplicationContextInitializer 类:

@ContextConfiguration

答案 2 :(得分:1)

回答何时和不希望使用它作为问题的一部分。

何时使用SpringJUnit4ClassRunner

应该非常谨慎地使用IMO SpringJUnit4ClassRunner。启动Spring容器以运行单元测试会涉及大量开销。

我通常使用SpringJUnit4ClassRunner进行测试:

  • 按预期方式注入(自动接线)组件
  • 按预期注入配置数据

例如,在注入组件时,如果未使用@Qualifier批注或未正确使用批注,则会出现问题。

从多个Yaml文件加载配置时,您可能需要测试地图是否按预期进行了合并,并且发生了适当的覆盖。

至少我总是有一个简单的SpringJUnit4ClassRunner测试,作为对Spring容器启动正常的检查。

何时不使用SpringJUnit4ClassRunner

在测试的代码中,我不会使用SpringJUnit4ClassRunner来测试与Spring不相关的功能。以我的经验,这意味着大多数功能。

因此,这意味着需要模拟任何自动装配的组件和注入的配置数据。这可能意味着您的单元测试需要很多设置代码。但是,对于您正在测试的类中的所有测试,只需要编写一次此设置代码。使用模拟组件运行单元测试也更快。

我使模拟保持简单,并使用Spock来模拟组件。常规代码示例:

import spock.lang.Specification

class FooManagerTest extends Specification {

  FooManager cut

  void createMockFooReporter() {
    FooReporter mockFooReporter = Mock(FooReporter)
    mockFooReporter.fooFormatter = Mock(FooFormatter)
  }

  void setup() {
    cut = new FooManager()
    cut.fooReporter = createMockFooReporter()
  }

  void "Basic test"() {
     // Do a basic test using 'cut'
  }

}

在此示例中,被测类FooManager具有自动连接的FooReporter,其本身包含自动连接的FooFormatter