对我来说(或者说根本就是)最好的解决方案是,在测试期间初始化一个替换注入实现的RoboGuice的Ln.Print类,以进行System.out打印而不是Android的Log打印,因为我实际上正在使用Robolectric,避免了首先依赖于Android子系统来运行我的测试。
从
Ln.java:
public class Ln {
...
@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);
}