java - icon - ¿Dónde se escribe la salida de registro cuando se usa Robolectric+Roboguice?
my icon java (6)
Agregue lo siguiente a su configuración de prueba antes de ejecutar la prueba:
ShadowLog.stream = System.out;
Robolectric.bindShadowClass(ShadowLog.class);
https://groups.google.com/forum/?fromgroups=#!msg/robolectric/PK-9cQQQROw/svuQzM5h_vsJ
Estoy usando Robolectric para probar Android. Estoy ejecutando mis pruebas a través de maven, por ejemplo
mvn -Dtest=LogTest test
Si tengo un código que escribe en los registros, como
Log.d("TAG", "blah");
o usando Roboguice''s Ln
Ln.d("blah");
No veo ningún resultado en los registros seguros de maven (archivos de texto).
Idealmente, en realidad quiero que las declaraciones de registro simples vayan a la consola. Puedo escribir en la consola usando System.out.println("blah")
, pero por supuesto prefiero usar las API de registro admitidas.
Entonces mi pregunta es, ¿por qué no estoy viendo la salida de registro y cómo puedo obtener los mensajes de registro escritos en la consola?
Cuando se ejecutan pruebas con maven todo lo que necesita es algo como esto:
<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>
Cuando se ejecutan las pruebas localmente, por ejemplo, en intellij, todo lo que necesita es una variable ambiental: simplemente vaya (para intellij) a Configuraciones de ejecución / depuración -> Valores predeterminados -> Junit -> Opciones de VM y agregue
-Drobolectric.logging=stdout
Estoy ejecutando robolectric-2.0-alpha-3 .
Lo que funcionó para mí fue establecer en el método setUp de mi prueba la transmisión a stdout
Algo como:
@Before
public void setUp() throws Exception {
ShadowLog.stream = System.out;
//you other setup here
}
Con esta versión de robolectric no tuve éxito haciendo lo mismo ( ShadowLog.stream = System.out
) en un TestRunner personalizado o en mi TestLifeycleApplication.
Establecer la propiedad del sistema System.setProperty("robolectric.logging","stdout");
tampoco tuvo efecto, pero podría funcionar en versiones anteriores.
Estoy usando robolectric 2.3. Cómo funciona para mí:
En mi @Antes:
ShadowLog.stream = System.out;
Dentro de mis funciones de prueba puedo usar (ShadowLog tiene otras opciones):
ShadowLog.v("tag", "message");
Y dentro de mi clase probada puedo poner algunos mensajes en el registro con:
System.out.println("message");
La solución que funcionó mejor para mí (o en absoluto) fue inicializar una implementación inyectada de reemplazo (durante la prueba solamente) de la clase Ln.Print de RoboGuice para hacer la impresión System.out en lugar de la impresión de registro de Android, dado que en realidad estaba usando Robolectric para en primer lugar, evitar tener que depender del subsistema Android para ejecutar mis pruebas.
De 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();
Así que básicamente:
public class TestModule extends AbstractModule {
@Override
protected void configure() {
bind(Ln.Print.class).to(TestLogPrint.class);
}
}
y:
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());
}
}
Eso, por supuesto, suponiendo que Robolectric init estándar enganche el módulo con 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);
}
Por defecto, la salida de registro cuando se utiliza RobolectricTestRunner desaparece. Puede configurar dónde va mirando el método setupLogging() de esa clase.
Para resumir, debe establecer la propiedad del sistema robolectric.logging
en stdout
, stderr
o en una ruta de archivo donde se debe escribir el registro. Hago esto en el constructor de una subclase de RobolectricTestRunner
que utilizo para todas las pruebas para que los registros siempre se escriban en stdout.