AndroidのテストにRobolectricを使用しています。私は、Mavenを介してテストを実行しています。
_mvn -Dtest=LogTest test
_
次のようなログに書き込むコードがある場合
_Log.d("TAG", "blah");
_
またはRoboguiceのLn
を使用して
_Ln.d("blah");
_
Mavenのsurefireログ(テキストファイル)に出力がありません。
理想的には、単純なログステートメントをコンソールに送信したいのです。 System.out.println("blah")
を使用してコンソールに書き込むことができますが、もちろんサポートされているロギングAPIを使用したいと思います。
だから私の質問は、なぜログ出力がまったく表示されないのですか、そしてログメッセージをコンソールに書き込むにはどうすればよいですか?
私はrobolectric-2.0-alpha-を実行しています。
私のために働いたのは、私のtestのsetUpメソッドにstdout
へのストリームを設定することでした
何かのようなもの:
_@Before
public void setUp() throws Exception {
ShadowLog.stream = System.out;
//you other setup here
}
_
このバージョンのrobolectricでは、カスタムTestRunnerまたはTestLifeycleApplicationで同じ(_ShadowLog.stream = System.out
_)を実行できませんでした。
システムプロパティSystem.setProperty("robolectric.logging","stdout");
を設定しても効果はありませんでしたが、以前のバージョンでは機能する可能性があります。
私はロボレクトリック2.3を使用しています。どのように私のために働く:
私の@Beforeに:
ShadowLog.stream = System.out;
私のテスト関数の中で使用できます(ShadowLog。他のオプションがあります):
ShadowLog.v("tag", "message");
そして、テストしたクラスの中で、ログにメッセージを書き込むことができます:
System.out.println("message");
デフォルトでは、 RobolectricTestRunner を使用した場合のログ出力は表示されなくなります。そのクラスの setupLogging() メソッドを調べることで、どこに行くかを構成できます。
要約すると、robolectric.logging
システムプロパティをstdout
、stderr
、またはログを書き込むファイルパスのいずれかに設定します。すべてのテストで使用するRobolectricTestRunner
のサブクラスのコンストラクターでこれを行うので、ログは常にstdoutに書き込まれます。
テストを実行する前に、テストセットアップに以下を追加します。
ShadowLog.stream = System.out;
Robolectric.bindShadowClass(ShadowLog.class);
https://groups.google.com/forum/?fromgroups=#!msg/robolectric/PK-9cQQQROw/svuQzM5h_vsJ
Mavenでテストを実行する場合、必要なのは次のようなものです。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<systemPropertyVariables>
<robolectric.logging>stdout</robolectric.logging>
</systemPropertyVariables>
</configuration>
</plugin>
ローカルでテストを実行するとき。 intellijでは、必要なのは環境変数だけです。(intellijの場合)構成の実行/デバッグ->デフォルト-> Junit-> VMオプションに移動して追加します
-Drobolectric.logging=stdout
私(またはまったく)に最適な解決策は、実際にRobolectricを使用している場合、Androidのログ印刷の代わりにSystem.out印刷を行うために、RoboGuiceのLn.Printクラスの置換注入実装(テスト中のみ)を初期化することでした。最初にテストを実行するためにAndroidサブシステムに依存する必要がないようにします。
から Ln.Java :
public class Ln {
...
/**
* print is initially set to Print(), then replaced by guice during
* static injection pass. This allows overriding where the log message is delivered to.
*/
@Inject protected static Print print = new Print();
だから基本的に:
public class TestModule extends AbstractModule {
@Override
protected void configure() {
bind(Ln.Print.class).to(TestLogPrint.class);
}
}
そして:
public class TestLogPrint extends Print {
public int println(int priority, String msg ) {
System.out.println(
String.format(
"%s%s",
getScope(4),
msg
)
);
return 0;
}
protected static String getScope(int skipDepth) {
final StackTraceElement trace = Thread.currentThread().getStackTrace()[skipDepth];
return String.format("%s | %s.%s | ", new Date(), trace.getFileName().replace(".Java", ""), trace.getMethodName());
}
}
もちろん、標準のRobolectric initがモジュールをRoboGuiceに接続することを想定しています。
@Before
public void setUp() throws Exception {
Module roboGuiceModule = RoboGuice.newDefaultRoboModule(Robolectric.application);
Module productionModule = Modules.override(roboGuiceModule).with(new CustomRoboModule());
Module testModule = Modules.override(productionModule).with(new TestModule());
RoboGuice.setBaseApplicationInjector(Robolectric.application, RoboGuice.DEFAULT_STAGE, testModule);
RoboGuice.injectMembers(Robolectric.application, this);
}