2016-08-03 236 views
0

当我分别运行测试类时,一切都很好,绿色。但是当我在Intellij中一起运行测试时,一些测试失败了。失败JMockit测试

我复制下面的代码这种行为:

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引擎中的一个bug /行为吗?其他想法?

顺便说一句:当我用maven执行测试时,everthing就像一个魅力。

回答

1

这不是一个错误。从使用的@Mocked(stubOutClassInitialization = true)产生的行为在相关API documentation,这下面我重现描述:

表示在嘲笑类的静态初始化代码是否应该被灭掉与否。静态初始化包括执行对类的静态字段的分配以及执行静态初始化块(如果有的话)。

默认情况下,模拟类中的静态初始化代码不会被截断。 JVM将只执行一次类的静态初始化,因此刷出初始化代码可能会产生意想不到的后果。静态初始化将在第一次实例化该类时发生,具有对其调用的静态方法或静态字段的值在运行时被访问时定义;这些是提示JVM初始化类的唯一事件。如果原始类初始化代码已被删除,那么它将不会在静态初始化时被执行,可能会将静态字段留空并且稍后导致NullPointerException发生。