2017-04-19 10 views
0

私はcan't fake an abstract class directlyと実装クラスを知っているので、私は実装クラスに偽を追加しました。jMockit Fake/MockUpを抽象メソッドとして削除するには?

@BeforeClass 
public static void fakeCurrentYear() { 
    // Mocking the abstract 'Calender' does not work, see: https://github.com/jmockit/jmockit1/issues/71 
    // So we use the implementing class 'GregorianCalendar'. 
    new MockUp<GregorianCalendar>() { 

     @Mock public int get(Invocation invocation, int field) { 
      return 2016; 
     } 
    }; 
} 

私はJUnit 4.12とMaven 3.xでjMockit v 1.31を使用しています。

テストを個別に実行すると、すべて問題ありません。

しかし、すべてのテストを一緒に実行すると、実装クラスのlog4jloggerが明らかに偽実装を使用するため、別のテストが失敗します。

以前はGregorianCalendarがそのメソッドを上書きしていなかったためです。しかし、私は、テストクラスの後で自動的に偽物が削除されたと思った!これはバグですか?

手動で削除できますか?私はJMockit v1.25に戻ってスタティック変数yearMock = new MockUp<GregorianCalendar>() ...を作成し、yearMock.tearDown()@AfterClassメソッドで呼び出しましたが、何も変更されませんでした。

答えて

0

私は、このメソッドを嘲笑私のテストでコード

private int currentYear4digits() { 
    return Calendar.getInstance().get(Calendar.YEAR); 
} 

の1行だけで、テスト対象のクラスのメソッドを作成し、回避策を使用しました。

@BeforeClass 
public static void fakeCurrentYear() { 
    new MockUp<MyClass>() { 

     @Mock 
     public int currentYear4digits() { 
      return 2016; 
     } 
    }; 
} 

ただし、これは回避策に過ぎません。 Calendarへの呼び出しが複数のクラスから作成されていると面倒です。

関連する問題