LogcatはAndroid機能であるため、ユニットテストではログ出力が表示されません.JUnitテストでは標準Javaのみしか使用できないため、Android機能は動作しません。
ユニットテストでは、テストされたコンポーネントに「テスト倍精度」を挿入できます。しかし、Log.x
コールは静的なので、コールを無効にすることはできません(例えば、PowerMockには解決しないでください。
したがって、最初のステップは、Log.x
通話のためのプロキシとして動作します非静的クラスを導入することになります。
/**
* This class is a non-static logger
*/
public class Logger {
public void e(String tag, String message) {
Log.e(tag, message);
}
public void w(String tag, String message) {
Log.w(tag, message);
}
public void v(String tag, String message) {
Log.v(tag, message);
}
public void d(String tag, String message) {
Log.d(tag, message);
}
}
は、あなたが今Log.x
電話を持っているすべての場所で、このクラスを使用します。
第二段階は、標準出力にリダイレクトLogger
の試験二重実装を作成することであろう。
public class UnitTestLogger extends Logger{
@Override
public void e(String tag, String message) {
System.out.println("E " + tag + ": " + message);
}
// similar for other methods
}
最後のステップは、ユニットテストでUnitTestLogger
代わりのLogger
を注入することである。
@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest {
private Logger mLogger = new UnitTestLogger();
private SomeClass SUT;
@Before
public void setup() throws Exception {
SUT = new SomeClass(/* other dependencies here */ mLogger);
}
}
OOPの概念について厳密に厳密にしたい場合は、Logger
とUnitTestLogger
の共通インターフェイスを抽出できます。
つまり、ユニットテストでLog.x
コールを調べる必要はありませんでした。私はあなたがそれを必要としないと思う。
コードは、If:あなたは
一般的なアドバイス...デバッグモードでユニットテストを実行し、コードの上にライン・バイ・ラインlogcat出力を調査しようとするよりもはるかに高速であるデバッガ、中をステップ実行することができますテストにはLog.x
スタティックコールが含まれており、ユニットテストはクラッシュしません。問題があります。
私はすべてのテストがRobolectric
で実行されているか、build.gradle:unitTests.returnDefaultValues = true
でこの文が実行されていると思います。
Robolectric
ですべてのテストを実行すると不安定ですが、すべてのAndroid呼び出しがデフォルト値を返す場合、テストスイートは信頼できません。私はあなたが将来的にあなたをかみ合わせてくれるので、さらに進める前にこの問題を修正することをお勧めします。
あなたはそれを行う方法を見つけましたか?私は今同じ質問に直面しています... –
@IgorGanapolsky、 – Vasiliy