我正在使用 Spring 和 Maven 编写 Junit 测试用例。我想并行运行 Junit 测试用例,为此我使用了 Maven Surefire 插件并行属性。该属性正在按需要运行。但在我的测试用例中,@Autowired 为第二个线程返回 null。
pom.xml
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<parallel>methods</parallel>
<threadCount>5</threadCount>
</configuration>
Class1.java
@Component
@Scope("prototype")
public class Class1 {
public void setParam(String s) {}
}
Class2.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { ApplicationConfiguration.class }, loader = AnnotationConfigContextLoader.class)
public class Class2 {
@Autowired
Class1 class1;
@Before
public void setInitialValue(){
class1.setParam("test");
}
@Test
public void run1() {
}
@Test
public void run2() {}
}
在此代码中,run1
和 run2
方法被并行调用,但当线程 2 运行时,Class2
中的 class1
对象的 setInitialValue()
方法抛出 NullPointerException
。
可能有点晚了,但仍然如此。当使用parallel=methods时,JUnit为每个测试类仅创建一个Runner实例,该实例由多个线程使用。
当使用parallel=classes
时,JUnit 会为每个线程创建一个带有专用 TestContextManager 的运行器,这应该可以解决问题。
我是一名优秀的程序员,十分优秀!