JMockit测试失败

时间:2016-08-03 14:14:31

标签: intellij-idea jmockit

当我单独运行测试类时,一切都很好并且是绿色的。但是当我在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");
    }

}

确保Test1Test2执行测试之前运行。

我想,在JMockit重写了类之后,TestSut类没有重新加载。

这是Ideas test exec引擎中的错误/行为吗?其他想法?

BTW:当我用maven执行Tests时,everthing就像魅力一样。

1 个答案:

答案 0 :(得分:1)

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

  

指示是否应该删除模拟类中的静态初始化代码。静态初始化包括执行对类的静态字段的赋值和静态初始化块的执行(如果有的话)。

     

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

相关问题