2016-08-03 234 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發生。