2012-04-19 3 views
43

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

mvn -Dtest=LogTest test 

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

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

или с использованием Roboguice в Ln

Ln.d("blah"); 

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

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

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

+0

ли работа с информацией/ошибка? – artbristol

+0

К сожалению, та же проблема –

+0

Это старый вопрос, но я хочу попросить Тайлера принять ответ. Когда вы принимаете ответы на свои вопросы, люди более охотно отвечают на ваши вопросы. – Christine

ответ

11

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

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

+1

Это сработало! Благодаря! Хорошие ссылки тоже. Теперь ... вы что-то читали где-то, или вы просто прорывались через источник? Кроме того, вы знакомы с Roboguice? Я хотел использовать их журнал регистрации «Ln», но если да, то он не печатается на stdout, хотя это странно, потому что кажется, что его реализация по умолчанию - это «android.util.Log», который должен работать, потому что Я могу использовать журнал напрямую. Мысли? –

+0

Я только нашел его, проскальзывая через код. Я не думаю, что это документировано где угодно. Что касается 'Ln', убедитесь, что ваше приложение« отлаживается », иначе' Ln' [автоматически отключает отладочное и подробное ведение журнала] (http://code.google.com/p/roboguice/wiki/Logging). –

+0

Крысы. Жаль, что ты плотный. Я понимаю, что это не решило мою проблему. Код, который вы указали, имеет смысл, но на самом деле он не работает. Я думал, что это работает, но это был оставшийся код, который я использовал, чтобы заставить его работать, начиная с: http://groups.google.com/group/robolectric/browse_thread/thread/f1a5df8b3849a4f3?pli=1 –

0

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

} 
+4

Что такое головная боль. –

5

Добавьте следующие строки в тестовой конфигурации, прежде чем тестовых прогонов:

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

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

+3

Я просто проверяю это на robolectric 2.x +. 'Robolectric.bindShadowClass (ShadowLog.class);' больше не требуется. – Macarse

+0

Yup. Это работает. Как говорит @Macarse, вторая строка не нужна - robolectric 2.2. –

+0

Я получаю сообщение об ошибке ** Невозможно разрешить метод bindShadowClass –

62

Я бегу robolectric-2,0-альфа-3.

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

+0

Это работает в 2.2 для меня. – Christine

+1

хорошее решение 2.4 работ –

+4

Отлично! Я называю это статическим методом, аннотированным с помощью '@ BeforeClass', который запускается только один раз для каждого тестового файла. – Kai

14

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

В моем @Before:

ShadowLog.stream = System.out; 

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

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

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

System.out.println("message"); 
+0

Я пробовал, но ничего не вижу. Где записывается вывод? Btw: Я использую Robolectric 2.4, но я думаю, что регистрация будет работать одинаково. –

+0

U может видеть результат в logcat. Убедитесь, что u положил ShadowLog.stream = System.out; в настройку ур. – Bamumi

+0

Почему бы просто не использовать 'System.out'? Зачем нужна «ShadowLog». –

1

При выполнении тестов с 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) для запуска/отладки Конфигурации -> Стандартные -> JUnit -> параметры виртуальной машины и добавить

-Drobolectric.logging=stdout