当我单独运行测试类时,一切都很好并且是绿色的。但是当我在Intellij中运行测试时,一些测试都失败了。
我使用以下代码重现了这种行为:
public class TestSut {
public static String test = "test";
public static String test() {
return test;
}
}
这是第一次测试:
@RunWith(JMockit.class)
public class Test1 {
@Mocked(stubOutClassInitialization = true)
TestSut test;
@Before
public void setUp() throws Exception {
}
@Test public void test_mocked_test_method() throws Exception {
new Expectations() {{
TestSut.test();
result = "new Test";
}};
assertThat(TestSut.test()).isEqualTo("new Test");
}
}
这是第二次测试:
@RunWith(JMockit.class)
public class Test2 {
@Before
public void setUp() throws Exception {
}
@Test
public void test_real_test_method() throws Exception {
assertThat(TestSut.test()).isEqualTo("test");
}
}
确保Test1
在Test2
执行测试之前运行。
我想,在JMockit重写了类之后,TestSut
类没有重新加载。
这是Ideas test exec引擎中的错误/行为吗?其他想法?
BTW:当我用maven执行Tests时,everthing就像魅力一样。
答案 0 :(得分:1)
这不是一个错误。使用@Mocked(stubOutClassInitialization = true)
产生的行为在相关API documentation中有所描述,我将在下面重现:
指示是否应该删除模拟类中的静态初始化代码。静态初始化包括执行对类的静态字段的赋值和静态初始化块的执行(如果有的话)。
默认情况下,模拟类中的静态初始化代码不会被删除。 JVM只会执行一次类的静态初始化,因此删除初始化代码会产生意想不到的后果。静态初始化将在第一次实例化类时发生,在其上调用静态方法,或者具有静态字段,其值在运行时被访问时定义;这些是提示JVM初始化类的唯一事件。如果原始的类初始化代码被删除了,那么它将不会在静态初始化时执行,可能会使静态字段为null,然后导致NullPointerException发生。