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

后端 未结 6 1609
被撕碎了的回忆
被撕碎了的回忆 2021-02-01 13:10

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

mvn -Dtest=LogTest test

If I have code that writes to the logs,

相关标签:
6条回答
  • 2021-02-01 13:28

    I am running robolectric-2.0-alpha-3.

    What worked for me was to set in the setUp method of my test the stream to 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.

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

    0 讨论(0)
  • 2021-02-01 13:32

    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.

    From 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:

    @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);
    
    }
    
    0 讨论(0)
  • 2021-02-01 13:39

    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

    0 讨论(0)
  • 2021-02-01 13:43

    Im using robolectric 2.3. How works for me:

    Into my @Before:

    ShadowLog.stream = System.out;
    

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

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

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

    System.out.println("message");
    
    0 讨论(0)
  • 2021-02-01 13:46

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

    To summarize, you need to set the robolectric.logging system 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 RobolectricTestRunner that I use for all tests so that logs always get written to stdout.

    0 讨论(0)
  • 2021-02-01 13:48

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

                     <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

    -Drobolectric.logging=stdout
    
    0 讨论(0)
提交回复
热议问题