2016-05-31 18 views
2

私はを使っています。MockitoPowerMockito私のユニットテストをAndroidで書いています。Mocking CountDownTimerとHandler

私はほとんどすべてをバックのもので処理することができましたが、私はCountDownTimerHandlerで立ち往生しています。私はCountDownTimerのサブクラスを模擬することができるよ、私はそれを模擬することはできませんよ

は、テストランナーレポートjava.lang.RuntimeException: Method cancel in android.os.CountDownTimer not mocked. See ...

最終方法cancel()ようですので、それぞれの時間がcancel()メソッドが呼び出されますRobolectricを使用せずに誰にでも解決策がありますか?

答えて

0

これは、コンパイル構造やテスト設定に問題があるようです。 質問にコンパイルのセットアップとテストコードの詳細を投稿すると便利です。


あなたは「メソッドが...嘲笑ない」取得しているので、あなたは明らかにすでにAndroidの付属モック優しいテストライブラリを使用しています。 Android SDKの最近のバージョンには、mockable Android jarが含まれています。最初はAndroid StudioとAndroidのgradleツールチェーンに付属しています。これにより、すべての実装がモックアップ可能なので、RobolectricやPowerMockitoを使用する必要はありません。

実行時に、すべてのfinal修飾子が削除されたandroid.jarの修正版に対してテストが実行されます。これにより、Mockitoのような人気の模擬ライブラリを使用できます。

のjavacは、静的なディスパッチ(すなわち、動的または仮想ではない)を使用して、静的、最終的なメソッドの呼び出しをコンパイルすることができますので、あなたが任意の中間成果物をコンパイルする場合は、あなたがこのfinalフリーのライブラリを活用自分ができないかもしれませんかライブラリは、にはandroid.jarのバージョンに対してfinalの修飾子が含まれています。バイトコードの最後のメソッドへの呼び出しがある場合、唯一残っているオプションは、RobolectricとPowerMockのようにバイトコードをインターセプトまたは書き換えることです。 PowerMockとそのPrepareForTestアノテーションは正しく動作するようにするのは難しい場合があります。そのため、失敗した場合は、ここにコードを投稿して見たい場合があります。

もちろん、テスト対象システムが新しく提供されたモックを使用することを保証する責任はあなたにあります。 PowerMockはコンストラクタへの呼び出しを傍受することができ、RobolectricはAndroidクラス全体を独自の代替方法で置き換えますが、その依存関係を一方的に注入する必要があるだけです。