これは、子のメソッドがスーパークラスのメソッドと異なる場合(つまり、子がそのメソッドをオーバーライドする場合、親メソッドをモックすることはできません)、PowerMockでは可能です。もう少し詳しくは、the relevant bug reportをご覧ください。
PowerMockの場合は、Suppressing Unwanted Behavior pageを調べて、必要に応じて十分かどうかを確認してください。
はあまり周りに掘った後、私はこれらのトリッキーな例についてJMockitを使用して終了しました。私がJMockitに移る前に、抑制を使用して例外がスローされたすべての場所をスタブしてみました。結局、私はいくつかのメソッドをオーバーライドする必要があっただけでなく、それらを抑制するため、私はそれを放棄して終了しました。 Androidの場合の
使用例:アクティブにすると
@MockClass(realClass = Activity.class, instantiation = PerMockedInstance)
public class FakeActivity {
public Bundle mSavedInstanceState;
@Mock
public void $init() {}
@Mock
public void onCreate(Bundle savedInstanceState) {
mSavedInstanceState = savedInstanceState;
}
}
、このクラスは$init()
でActivity
のデフォルトコンストラクタを交換し、交換します:
まず、あなたは@MockClass
注釈を使用して、スーパークラスをモック上記のものとonCreate
メソッド。アンドロイドでは、テスト対象のユニットはアクティビティから派生しています(私のサンプルコードではHelloTestActivity
)。テストクラスは次のようになります。
public class HelloTestActivityTest3 extends AndroidTest {
@Tested
HelloTestActivity activity;
FakeActivity fakeActivity = new FakeActivity();
@Before
public void setupMocks()
{
Mockit.setUpMock(fakeActivity);
}
@Test
public void onCreate_bundle(@Mocked Bundle savedInstanceState)
{
// Try to access out-of-band information from the fake
activity.onCreate(savedInstanceState);
assertSame(savedInstanceState, fakeActivity.mSavedInstanceState);
}
}
コールMockit.setupMock(fakeActivity)
偽の私のインスタンスでスーパークラスを置き換えます。この使用法では、偽のクラスの内部状態にもアクセスできます。カスタム機能を持つメソッドをオーバーライドする必要がない場合は、Mockit
クラスから利用できる他のメソッドを使用できます。
rogerioが以下のコメントで指摘したように、Activity
クラスを嘲笑することは最低限です。次のコードはこれを示しています。
public class HelloTestActivityTest4 {
@Tested
HelloTestActivity activity;
@Mocked
Activity base;
@Test
public void testOnCreate() throws Exception {
// Just make sure "Stub!" exception is not thrown.
activity.onCreate(null);
}
}
Activity
クラスの全てのメソッド(静的初期を除く)を引き起こし、そのスーパークラスがHelloActivityTest4
で定義されたテストでモックする@Mocked Activity base;
宣言。
どのようにあなたのモックコールスーパー()?あなたはコード例を提供できますか? – nansen
@nansen私はモックから 'super()'を呼び出すのではなく、モックはスーパークラスです。私の編集内容を見てください。 –
私はそのクラス 'S'が大好きです。 – DerMike