我试图并行运行我的 JUnit 类,每次运行测试时都会遇到不同的错误。有时 ClassA 失败,有时 ClassB 失败,有时没有失败。
我正在使用 maven-surefire-plugin(版本 2.19.1)和 JUnit 4.8。我注意到我得到的异常是来自 EasyMock 的断言错误。问题似乎是当我有一个创建 Logger 类 (log4j) 实例的类时,内部调用“RepositorySelector.getLoggerRepository()”来获取给定“类名”的 Logger。当它并行运行时,多个类会创建一个 Logger 实例,并且 EasyMock 检测到“RepositorySelector.getLoggerRepository()”的调用次数超过了预期的调用次数。
这里有一个例子:
public class ClassA{
private static final Logger LOGGER = Logger.getLogger(ClassA.class);
public void someMethod(){
LOGGER.info("SomeMethod");
}
}
public class ClassB{
private static final Logger LOGGER = Logger.getLogger(ClassB.class);
public void someMethodB(){
LOGGER.info("SomeMethodB");
}
}
public class ClassATest{
private ClassA classUnderTest;
@Before
public void setUp(){
classUnderTest = new ClassA();
}
@Test
public void testSomeMethod(){
classUnderTest.someMethod();
}
}
public class ClassBTest{
private ClassB classUnderTest;
@Before
public void setUp(){
classUnderTest = new ClassB();
}
@Test
public void testSomeMethodB(){
classUnderTest.someMethodB();
}
}
我的 pom.xml 上有这个配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<forkMode>once</forkMode>
<!-- Parallel classes -->
<parallel>classes</parallel>
<threadCountClasses>2</threadCountClasses>
</configuration>
</plugin>
对我来说,好像两个测试同时运行,每个测试都执行@Before方法(setUp方法)并调用ClassA或B的构造函数,它创建了一个Logger类的新实例,并且出于某种原因EasyMock是尝试验证次数,并且在哪里出现断言错误。那是我缺少的东西吗?还是 EasyMock 无法处理的事情?
我最初的项目有一百个 JUnit 测试,几乎所有的测试都在记录一些信息。如果我禁用“并行”选项,一切正常。有时我得到断言错误,其他时候我得到一个 NullPointerException 像 @Before 方法永远不会被执行,它试图执行 @Test 方法并抛出 NPE 因为它之前没有初始化。(这种情况发生了几次)。
有什么想法吗?我在这里错过了什么吗?
Java版本:jdk1.7.0_55 Maven:apache-maven-3.2.5 Junit:4.8.2 Maven Surefire插件:2.19.1 EasyMock:3.2(easymockclassextension)