49

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

mvn -Dtest=LogTest test

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

Log.d("TAG", "blah");

またはRoboguiceの使用Ln

Ln.d("blah");

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

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

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

4

6 に答える 6

78

私はrobolectric-2.0-alpha-3 を実行しています。

私にとってうまくいったのは、テストのsetUpメソッドでストリームをに設定することでしたstdout

何かのようなもの:

@Before
public void setUp() throws Exception {
  ShadowLog.stream = System.out;
  //you other setup here
}

このバージョンの robolectricShadowLog.stream = System.outでは、カスタム TestRunner または TestLifeycleApplication で同じ ( ) を実行することに成功しませんでした。

システム プロパティSystem.setProperty("robolectric.logging","stdout");を設定しても効果はありませんでしたが、以前のバージョンでは機能する可能性があります。

于 2013-05-04T16:09:09.123 に答える
14

私はrobolectric 2.3を使用しています。私にとってどのように機能するか:

私の@Beforeに:

ShadowLog.stream = System.out;

テスト関数内で使用できます (ShadowLog.には他のオプションがあります):

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

そして、テストしたクラス内で、ログにいくつかのメッセージを入れることができます:

System.out.println("message");
于 2014-10-10T13:20:36.393 に答える
12

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

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

于 2012-04-20T09:08:23.177 に答える
2

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
于 2014-12-11T00:18:56.883 に答える
0

私にとって (またはまったく) うまくいった解決策は、RoboGuice の Ln.Print クラスの置換注入実装 (テスト中のみ) を初期化して、Android の Log 印刷の代わりに System.out 印刷を行うことでした。そもそもテストを実行するために 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());
    }
}

もちろん、RoboGuice でモジュールを接続するための標準の Robolectric init を想定しています。

@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);

}
于 2013-01-21T19:35:44.137 に答える