我正在使用Robolectric来测试Android。我正在通过maven运行我的测试,例如
mvn -Dtest=LogTest test
如果我有代码写入日志,例如
Log.d("TAG", "blah");
或使用Roboguice的Ln
Ln.d("blah");
我在maven的surefire日志(文本文件)中看不到任何输出。
理想情况下,我实际上想要简单的日志语句转到控制台。我可以使用System.out.println("blah")
写入控制台,但当然我宁愿使用支持的日志API。
所以我的问题是,为什么我根本看不到日志输出,如何将日志消息写入控制台?
答案 0 :(得分:70)
我正在运行 robolectric-2.0-alpha-3 。
对我来说有用的是将测试的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");
也没有效果,但它可能适用于以前的版本。
答案 1 :(得分:14)
我正在使用robolectric 2.3。对我有用:
进入我的@Before:
ShadowLog.stream = System.out;
在我的测试功能中,我可以使用(ShadowLog。有其他选项):
ShadowLog.v("tag", "message");
在我测试的课程中,我可以在日志中添加一些消息:
System.out.println("message");
答案 2 :(得分:11)
默认情况下,使用RobolectricTestRunner时的日志输出消失。您可以通过查看该类的setupLogging()方法来配置它的位置。
总而言之,您需要将robolectric.logging
系统属性设置为stdout
,stderr
或应写入日志的文件路径。我在RobolectricTestRunner
的子类的构造函数中执行此操作,我将其用于所有测试,以便始终将日志写入stdout。
答案 3 :(得分:5)
在测试运行之前将以下内容添加到测试设置中:
ShadowLog.stream = System.out;
Robolectric.bindShadowClass(ShadowLog.class);
https://groups.google.com/forum/?fromgroups=#!msg/robolectric/PK-9cQQQROw/svuQzM5h_vsJ
答案 4 :(得分: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)运行/调试配置 - &gt;默认值 - &gt; Junit - &gt; VM选项并添加
-Drobolectric.logging=stdout
答案 5 :(得分:0)
最适合我(或根本没有)的解决方案是初始化RoboGuice的Ln.Print类的替换注入实现(仅在测试期间)以执行System.out打印而不是Android的Log打印,因为我实际上是使用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);
}