49

我正在使用 Robolectric 来测试 Android。我正在通过 Maven 运行我的测试,例如

mvn -Dtest=LogTest test

如果我有写入日志的代码,例如

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

或使用 Roboguice 的Ln

Ln.d("blah");

我在 Maven 的安全日志(文本文件)中看不到任何输出。

理想情况下,我实际上想要简单的日志语句进入控制台。我可以使用 写入控制台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
}

ShadowLog.stream = System.out使用这个版本的 robolectric,我在自定义 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用于所有测试的子类的构造函数中执行此操作,以便始终将日志写入标准输出。

于 2012-04-20T09:08:23.177 回答
5

在测试运行之前将以下内容添加到测试设置中:

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

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

于 2013-04-12T05:40:14.700 回答
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 类的替换注入实现(仅在测试期间)以进行 System.out 打印而不是 Android 的日志打印,因为我实际上使用 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);

}
于 2013-01-21T19:35:44.137 回答