2016-08-03 61 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 engineのバグ/動作ですか?他のアイデア?

ところで:私がmavenでTestを実行すると、何かが魅力的に機能します。

答えて

1

これはバグではありません。 @Mocked(stubOutClassInitialization = true)の使用から生じる挙動は、私は以下再現関連API documentation、に記載されている:

は、モッククラスの静的初期化コードが出スタブするかどうかを示します。静的初期化には、クラスの静的フィールドへの代入の実行と、静的初期化ブロック(存在する場合)の実行が含まれます。

デフォルトでは、モックされたクラスの静的初期化コードはスタブアウトされません。 JVMはクラスの静的初期化を1回だけ実行するため、初期化コードをスタブアウトすると予期しない結果が生じることがあります。静的初期化は、クラスが初めてインスタンス化されたとき、または静的メソッドが呼び出されたとき、または実行時に値が定義された静的フィールドがアクセスされたときに発生します。これらはJVMにクラスの初期化を促す唯一のイベントです。元のクラス初期化コードがスタブアウトされた場合、静的初期化時には実行されず、静的フィールドがnullのままになり、後でNullPointerExceptionが発生する可能性があります。

関連する問題