3

アプリで特定の条件が発生したときにエラー メッセージがログに記録されるかどうかを確認する必要がある単体テストを実行する必要があります。

  try {
        //do something
    } catch (ClassCastException | IndexOutOfBoundsException e) {
        Log.e(INFOTAG, "Exception "+e.getMessage());
    }

どうすればこれをテストできますか? 単体テスト中に以下のエラーが発生します。

Caused by: java.lang.RuntimeException: Method e in android.util.Log not mocked.
4

1 に答える 1

3

これを行うには、次の 2 つの方法があります。

  1. Powermock または Powermokito に目を向けます。これらのモック フレームワークを使用すると、Log.e() への静的呼び出しをモック/チェックできるようになります。
  2. 静的呼び出しを置き換えることを検討できます。

例:

interface LogWrapper {
   public void e( whatever Log.e needs);
}

class LogImpl implements LogWrapper {
   @Override 
   e ( whatever ) { 
    Log.e (whatever) ; 
   }

次に、依存性注入を使用して、LogWrapperログに記録するクラス内でオブジェクトを使用できるようにする必要があります。通常の「本番」での使用では、そのオブジェクトは単純にLogImpl;のインスタンスです。テストのために、自己作成の impl を使用できます (ログが送信されたことを追跡します)。または、非パワー モッキング フレームワーク (EasyMock や Mokito など) を使用してモックすることもできます。次に、モッキング フレームワークのチェック/検証の側面を使用して、「期待されるパラメーターでログが呼び出された」ことを確認します。

注意: 設定によっては、オプション 2 はやり過ぎかもしれません。しかし、個人的には、Powermock の使用は避けています。Powermock の奇妙な問題を探し出すために人生の多くの時間を無駄にしてきたからです。そして、私はカバレッジ測定をするのが好きです。また、Powermock で問題が発生することもあります。

しかし、Powermock について質問している場合は、基本的にここ (powermockito)またはここ (powermock ) を参照する必要があります。記録として、次回はお気に入りの検索エンジンを使用してみてください。これを尋ねるのはあなたが最初の人ではありません。

于 2016-08-10T04:07:32.303 に答える