我使用Robolectric测试Android系统。 我正在通过行家,如我的测试
mvn -Dtest=LogTest test
如果我有一些代码写入日志,如
Log.d("TAG", "blah");
或使用Roboguice的Ln
Ln.d("blah");
我没有看到Maven的万无一失日志(文本文件)的输出。
理想情况下,其实我是想简单的日志报表去控制台。 我可以写信给使用控制台System.out.println("blah")
但我当然宁愿使用支持的日志记录API。
所以我的问题是,为什么我没有看到日志输出可言的,我怎么能得到写入控制台的日志消息?
我正在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");
是没有效果为好,但它可能在以前的版本的作品。
即时通讯使用robolectric 2.3。 如何为我工作:
进入我的@Before:
ShadowLog.stream = System.out;
在我的测试功能,我可以使用(ShadowLog有其他的选择。):
ShadowLog.v("tag", "message");
而我的测试类中,我可以在日志中放置了一些消息:
System.out.println("message");
默认情况下,当使用日志输出RobolectricTestRunner消失。 你可以配置它去通过查看设置→()这个类的方法。
总之,您需要将设置robolectric.logging
系统属性要么stdout
, stderr
,或者日志应该写入的文件路径。 我这样做是在子类的构造函数RobolectricTestRunner
,我使用的所有测试,使日志总是被写入到标准输出。
以下添加到您的测试设置您的测试运行之前:
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
制定出最适合我(或全部)的解决方案是初始化更换注射执行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);
}