2017-12-15 22 views
0

せずに、私はこのコードでユニットテストを実行しようとしてい:モックandroid.os.BaseBundle roboelectric

Bundle cidParam(String accountId) { 
    Bundle params = new Bundle(1); 
    params.putString(Params.CID, accountId); 

    return params; 
} 

これは、ユニットテストです:

private void mockBundle(String cid) throws Exception { 
    Bundle mBundle = PowerMockito.mock(Bundle.class); 
    PowerMockito.doNothing().when((BaseBundle)mBundle).putString(AnalyticsController.Params.CID, cid); 
} 

しかし、それは常に返します。

java.lang.RuntimeException: Method putString in android.os.BaseBundle not mocked. 

私はroboelectricを使ってシミュレータを回転させ、実際のバンドルを呼び出すことができます。しかし、単体テストは遅くなります。誰でもAndroid.os.baseを模擬する方法を知っていますか?ありがとうございました。

+0

'新しいバンドル(1);'を別のパッケージレベルメソッドに移動できるようにリファクタリングすることはできますか? –

答えて

0

私は結局私の友人から答えを得る。理由何とかメインクラスpowermockito使ってAndroidのクラスをあざけるためにあまりにもテストのために準備として設定する必要がありますされています

@PrepareForTest({MainClass.class, Bundle.class}) 

は努力@Maciejコワルスキーいただきありがとうございます。とにかくそれが正しい方向にあるので、私はあなたの努力のために投票します。

1

1)適切なセットアップdo().when()ため

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Bundle.class) 
public class MyTest{ 

2)使用バニラMockitoを追加します:whenNew()ため

Bundle mBundle = PowerMockito.mock(Bundle.class); 
    Mockito.doNothing().when(mBundle).putString(AnalyticsController.Params.CID, cid); 

3)使用Powermock:

PowerMockito.whenNew(Bundle.class) 
      .withAnyArguments().thenReturn(mBundle); 
+0

こんにちは@Maciej Kowalski助けてくれてありがとう。私はあなたのコードを入れても、まだ動作しません。同じエラーが返されます。なぜそれがうまくいかないのか本当に不思議です。親クラスである 'android.os.BaseBundle not mocked'がエラーになっているのはなぜですか?バンドルクラスが最終的なのはなぜですか?それ以上の洞察があれば教えてください。ありがとうございます – surga

+0

ok、次にPowerMock.createMock(Bundle.class)が必要です。 Mockito.mockの代わりに –

+0

申し訳ありません 'PowerMockito.mock'と' PowerMock.createMock'の違いは何ですか? – surga

関連する問題