Где записывается вывод журнала при использовании Robolectric + Roboguice?

Я использую Robolectric для тестирования Android. Я запускаю свои тесты через maven, например

mvn -Dtest=LogTest test 

Если у меня есть код, который записывает в журналы, например

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

Или используя Lon Roboguice

 Ln.d("blah"); 

Я не вижу никаких выходных данных в журналах surefire maven (текстовые файлы).

В идеале, на самом деле я хочу, чтобы простые отчеты журнала приходили на консоль. Я могу писать на консоль, используя System.out.println("blah") , но, конечно, я бы предпочел использовать поддерживаемые API протоколирования.

Поэтому мой вопрос: почему я вообще не вижу выход журналов и как я могу получить сообщения журнала, записанные на консоль?

Solutions Collecting From Web of "Где записывается вывод журнала при использовании Robolectric + Roboguice?"

Я работаю robolectric-2.0-alpha-3 .

Что работало для меня, было установить в методе setUp моего теста поток на 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"); Также не имеет никакого эффекта, но может работать в предыдущих версиях.

Im с использованием robolectric 2.3. Как работает для меня:

В мой @Before:

 ShadowLog.stream = System.out; 

Внутри моих тестовых функций я могу использовать (ShadowLog. Есть другие опции):

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

И внутри моего тестируемого класса я могу поместить некоторые сообщения в журнал с помощью:

 System.out.println("message"); 

По умолчанию вывод журнала при использовании RobolectricTestRunner исчезает. Вы можете настроить, где это делается, посмотрев метод setupLogging () этого класса.

Подводя итог, вам нужно установить свойство robolectric.logging на stdout , stderr или путь к файлу, где должен записываться журнал. Я делаю это в конструкторе подкласса RobolectricTestRunner который я использую для всех тестов, чтобы журналы всегда записывались в stdout.

Добавьте перед установкой тестового теста следующее:

 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) в Run / Debug Configurations -> Defaults -> Junit -> VM options и добавьте

 -Drobolectric.logging=stdout 

Лучшим решением для меня (или вообще) было инициализировать замененную внедренную реализацию (только при тестировании) класса Ln.Print от RoboGuice, чтобы делать печать System.out вместо печати журнала Android, учитывая, что я фактически использовал 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); }