其中的日志输出写入使用Robolectric + Roboguice何时?(Where is log

2019-07-29 01:36发布

我使用Robolectric测试Android系统。 我正在通过行家,如我的测试

mvn -Dtest=LogTest test

如果我有一些代码写入日志,如

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

或使用Roboguice的Ln

Ln.d("blah");

我没有看到Maven的万无一失日志(文本文件)的输出。

理想情况下,其实我是想简单的日志报表去控制台。 我可以写信给使用控制台System.out.println("blah")但我当然宁愿使用支持的日志记录API。

所以我的问题是,为什么我没有看到日志输出可言的,我怎么能得到写入控制台的日志消息?

Answer 1:

我正在robolectric-2.0-α-3。

什么工作对我来说是在我的测试流的设置方法来设置到stdout

就像是:

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

在这个版本中robolectric的我没有成功做同样的( ShadowLog.stream = System.out在自定义的TestRunner或者在我TestLifeycleApplication)。

设置系统属性System.setProperty("robolectric.logging","stdout"); 是没有效果为好,但它可能在以前的版本的作品。



Answer 2:

即时通讯使用robolectric 2.3。 如何为我工作:

进入我的@Before:

ShadowLog.stream = System.out;

在我的测试功能,我可以使用(ShadowLog有其他的选择。):

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

而我的测试类中,我可以在日志中放置了一些消息:

System.out.println("message");


Answer 3:

默认情况下,当使用日志输出RobolectricTestRunner消失。 你可以配置它去通过查看设置→()这个类的方法。

总之,您需要将设置robolectric.logging系统属性要么stdoutstderr ,或者日志应该写入的文件路径。 我这样做是在子类的构造函数RobolectricTestRunner ,我使用的所有测试,使日志总是被写入到标准输出。



Answer 4:

以下添加到您的测试设置您的测试运行之前:

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

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



Answer 5:

当运行与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


Answer 6:

制定出最适合我(或全部)的解决方案是初始化更换注射执行RoboGuice的Ln.Print类的做,而不是Android的日志打印的System.out打印(仅测试期间),我其实是用Robolectric给定避免依赖于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);

}


文章来源: Where is log output written to when using Robolectric + Roboguice?