这个注释有什么作用?
我什么时候想用呢?
我什么时候不想使用它?
@RunWith(SpringJUnit4ClassRunner.class)
我可以在Google上找到更多这方面的用法,并且没有找到关于这个注释应该与我沟通的内容或何时/为什么要使用它的101解释?
答案 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)
回答何时和不希望使用它作为问题的一部分。
应该非常谨慎地使用IMO SpringJUnit4ClassRunner。启动Spring容器以运行单元测试会涉及大量开销。
我通常使用SpringJUnit4ClassRunner进行测试:
例如,在注入组件时,如果未使用@Qualifier
批注或未正确使用批注,则会出现问题。
从多个Yaml文件加载配置时,您可能需要测试地图是否按预期进行了合并,并且发生了适当的覆盖。
至少我总是有一个简单的SpringJUnit4ClassRunner测试,作为对Spring容器启动正常的检查。
在测试的代码中,我不会使用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
。