java 使用 Robolectric + Roboguice 时日志输出写到哪里?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10219915/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 00:05:58  来源:igfitidea点击:

Where is log output written to when using Robolectric + Roboguice?

javaandroidmaven-2roboguicerobolectric

提问by Tyler Collier

I'm using Robolectric to test Android. I'm running my tests via maven, e.g.

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

mvn -Dtest=LogTest test

If I have code that writes to the logs, such as

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

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

or using Roboguice's Ln

或使用 Roboguice 的 Ln

Ln.d("blah");

I don't see any output in maven's surefire logs (text files).

我在 Maven 的 surefire 日志(文本文件)中没有看到任何输出。

Ideally, I actually want simple log statements to go to the console. I can write to the console by using System.out.println("blah"), but of course I'd rather use the supported logging APIs.

理想情况下,我实际上希望简单的日志语句进入控制台。我可以使用 写入控制台System.out.println("blah"),但当然我更愿意使用支持的日志记录 API。

So my question is, why am I not seeing log output at all, and how can I get the log messages written to the console?

所以我的问题是,为什么我根本看不到日志输出,以及如何将日志消息写入控制台?

回答by Jesus Monzon Legido

I am running robolectric-2.0-alpha-3.

我正在运行robolectric-2.0-alpha-3

What worked for me was to set in the setUp method of my testthe stream to stdout

对我有用的是在我的测试的setUp 方法中将流设置为stdout

Something like:

就像是:

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

With this version of robolectric I had no success doing the same (ShadowLog.stream = System.out) in a custom TestRunner or in my TestLifeycleApplication.

使用这个版本的 robolectric,我ShadowLog.stream = System.out在自定义 TestRunner 或我的 TestLifeycleApplication 中执行相同的 ( )没有成功。

Setting the system property System.setProperty("robolectric.logging","stdout");was of no effect as well, but it might works in previous versions.

设置系统属性System.setProperty("robolectric.logging","stdout");也不起作用,但它可能适用于以前的版本。

回答by Bamumi

Im using robolectric 2.3. How works for me:

我正在使用 robolectric 2.3。如何对我来说有效:

Into my @Before:

进入我的@Before:

ShadowLog.stream = System.out;

Inside my test functions i can use (ShadowLog. have other options):

在我的测试函数中,我可以使用(ShadowLog。还有其他选项):

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

And inside my tested class I can put some messages at log with:

在我测试过的课程中,我可以在日志中放置一些消息:

System.out.println("message");

回答by Edward Dale

By default, logging output when using the RobolectricTestRunnerdisappears. You can configure where it goes by looking at the setupLogging()method of that class.

默认情况下,使用RobolectricTestRunner时的日志输出消失。您可以通过查看该类的 setupLogging()方法来配置它的去向

To summarize, you need to set the robolectric.loggingsystem property to either stdout, stderr, or a file path where the log should be written. I do this in the constructor of a subclass of RobolectricTestRunnerthat I use for all tests so that logs always get written to stdout.

总之,您需要将设置robolectric.logging系统属性要么stdoutstderr或在日志中应写入的文件路径。我在RobolectricTestRunner用于所有测试的子类的构造函数中执行此操作,以便日志始终写入标准输出。

回答by emmby

Add the following to your test setup before your test runs:

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

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

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

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

回答by sakis kaliakoudas

When running tests with maven all you need is something like this :

使用 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>

When running the tests locally, e.g. in intellij, then all you need is an environmental variable: Just go (for intellij) to Run/Debug Configurations --> Defaults -->Junit --> VM options and add

在本地运行测试时,例如在 intellij 中,您只需要一个环境变量:只需(对于 intellij)运行/调试配置 --> 默认值 --> Junit --> VM 选项并添加

-Drobolectric.logging=stdout

回答by Roberto Andrade

The solution that worked out best for me (or at all) was to initialize a replacement injected implementation (during testing only) of RoboGuice's Ln.Print class to do System.out printing instead of Android's Log printing, given I was actually using Robolectric to avoid having to depend on the Android subsystem to run my tests in the first place.

最适合我(或根本不适合)的解决方案是初始化 RoboGuice 的 Ln.Print 类的替换注入实现(仅在测试期间)以执行 System.out 打印而不是 Android 的日志打印,因为我实际上使用的是 Robolectric首先避免必须依赖 Android 子系统来运行我的测试。

From Ln.java:

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();

So basically:

所以基本上:

public class TestModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(Ln.Print.class).to(TestLogPrint.class);
    }

}

and:

和:

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());
    }
}

That of course assuming the standard Robolectric init to hook the module up with RoboGuice:

当然,假设标准的 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);

}