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

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

mvn -Dtest=LogTest test

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

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

или с помощью Ln от Roboguice

Ln.d("blah");

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

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

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


person Tyler Collier    schedule 19.04.2012    source источник
comment
Работает ли с информацией/ошибкой?   -  person artbristol    schedule 19.04.2012
comment
Это старый вопрос, но я хочу попросить Тайлера принять ответ. Когда вы принимаете ответы на свои вопросы, люди охотнее отвечают на ваши вопросы.   -  person Christine    schedule 07.08.2014
comment
@Кристина, я согласна, Кристина. Однако у меня больше нет возможности проверить, работают ли опубликованные здесь ответы. В то время ни один из ответов не помог мне. Я проголосовал за ответ scompt.com, но потом понял, что это не решило проблему для меня, как я отметил в комментариях. Есть ли политика / руководство для того, что я должен все это время позже?   -  person Tyler Collier    schedule 07.08.2014
comment
Решение Иисуса Монзона Легидо отлично работает, я его использую. Кроме того, это самое простое решение.   -  person Christine    schedule 08.08.2014


Ответы (6)


Я использую 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"); тоже не дала результата, но может работать в предыдущих версиях.

person Jesus Monzon Legido    schedule 04.05.2013
comment
Большой! Я вызываю это в статическом методе, аннотированном @BeforeClass, чтобы запускать его только один раз для каждого тестового файла. - person Kai; 16.06.2015
comment
Работает и на robolectric 3.0. - person Ivan Kušt; 20.10.2015

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

В моем @Before:

ShadowLog.stream = System.out;

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

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

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

System.out.println("message");
person Bamumi    schedule 10.10.2014
comment
Я пробовал, но ничего не вижу. Где пишется вывод? Кстати: я использую Robolectric 2.4, но я думаю, что логирование будет работать так же. - person ; 03.12.2014
comment
Вы можете увидеть результат в logcat. Проверьте, поместили ли вы ShadowLog.stream = System.out; в вашу настройку. - person Bamumi; 04.12.2014
comment
Почему бы просто не использовать System.out? Зачем нужна ShadowLog. - person IgorGanapolsky; 01.04.2016

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

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

person Edward Dale    schedule 20.04.2012
comment
Это сработало! Спасибо! Тоже хорошие ссылки. Теперь... вы где-то об этом читали или просто рылись в источнике? Кроме того, вы знакомы с Roboguice? Я хотел использовать их ведение журнала Ln, но если я это сделаю, оно не будет распечатано на стандартный вывод, хотя это странно, потому что кажется, что его реализация по умолчанию осуществляется через android.util.Log, что должно работать, потому что я могу использовать Log напрямую. Мысли? - person Tyler Collier; 21.04.2012
comment
Я нашел это, только продираясь через код. Я не думаю, что это где-либо задокументировано. Что касается Ln, убедитесь, что ваше приложение debuggable, в противном случае Ln автоматически отключает отладку и подробное ведение журнала< /а>. - person Edward Dale; 21.04.2012
comment
Существует ли setupLogging()? pivotal.github.io/robolectric/javadoc/com/xtremelabs/ - person emmby; 12.04.2013
comment
Да, он все еще находится в RobolectricTestRunner., но пакет был изменен. - person Edward Dale; 12.04.2013

Перед запуском теста добавьте в настройки теста следующее:

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

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

person emmby    schedule 12.04.2013
comment
Я просто тестирую это с robolectric 2.x+. Robolectric.bindShadowClass(ShadowLog.class); больше не нужен. - person Macarse; 28.09.2013
comment
Ага. Это работает. Как говорит @Macarse, вторая строка не нужна - robolectric 2.2. - person Julian A.; 02.12.2013
comment
Я получаю сообщение об ошибке **Не удается разрешить метод 'bindShadowClass' - person IgorGanapolsky; 01.04.2016

При запуске тестов с 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
person sakis kaliakoudas    schedule 11.12.2014

Решение, которое сработало лучше всего для меня (или вообще) состояло в том, чтобы инициализировать внедренную замену (только во время тестирования) класса 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 для подключения модуля к 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);

}
person Roberto Andrade    schedule 21.01.2013