web-dev-qa-db-ja.com

Robolectric + Roboguiceを使用する場合、ログ出力はどこに書き込まれますか?

AndroidのテストにRobolectricを使用しています。私は、Mavenを介してテストを実行しています。

_mvn -Dtest=LogTest test
_

次のようなログに書き込むコードがある場合

_Log.d("TAG", "blah");
_

またはRoboguiceのLnを使用して

_Ln.d("blah");
_

Mavenのsurefireログ(テキストファイル)に出力がありません。

理想的には、単純なログステートメントをコンソールに送信したいのです。 System.out.println("blah")を使用してコンソールに書き込むことができますが、もちろんサポートされているロギングAPIを使用したいと思います。

だから私の質問は、なぜログ出力がまったく表示されないのですか、そしてログメッセージをコンソールに書き込むにはどうすればよいですか?

47
Tyler Collier

私は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");を設定しても効果はありませんでしたが、以前のバージョンでは機能する可能性があります。

71

私はロボレクトリック2.3を使用しています。どのように私のために働く:

私の@Beforeに:

ShadowLog.stream = System.out;

私のテスト関数の中で使用できます(ShadowLog。他のオプションがあります):

ShadowLog.v("tag", "message");

そして、テストしたクラスの中で、ログにメッセージを書き込むことができます:

System.out.println("message");
14
Bamumi

デフォルトでは、 RobolectricTestRunner を使用した場合のログ出力は表示されなくなります。そのクラスの setupLogging() メソッドを調べることで、どこに行くかを構成できます。

要約すると、robolectric.loggingシステムプロパティをstdoutstderr、またはログを書き込むファイルパスのいずれかに設定します。すべてのテストで使用するRobolectricTestRunnerのサブクラスのコンストラクターでこれを行うので、ログは常にstdoutに書き込まれます。

11
Edward Dale

テストを実行する前に、テストセットアップに以下を追加します。

ShadowLog.stream = System.out;
Robolectric.bindShadowClass(ShadowLog.class);

https://groups.google.com/forum/?fromgroups=#!msg/robolectric/PK-9cQQQROw/svuQzM5h_vsJ

5
emmby

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
2

私(またはまったく)に最適な解決策は、実際に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);

}
0
Roberto Andrade