L'output di Logcat non verrà visualizzato nei test di unità perché Logcat è una funzionalità Android: i test di JUnit possono utilizzare solo Java standard, pertanto le funzionalità di Android non funzioneranno.
Ciò che è possibile fare nei test di unità è iniettare "duplicati di prova" in componenti testati. Ma le chiamate Log.x
sono statiche, quindi non puoi sovrascriverle (senza risolvere ad esempio PowerMock, che dovresti evitare a tutti i costi).
Pertanto, il primo passo sarà quello di introdurre una classe non-statica che si comporterà come un proxy per Log.x
chiamate:
/**
* This class is a non-static logger
*/
public class Logger {
public void e(String tag, String message) {
Log.e(tag, message);
}
public void w(String tag, String message) {
Log.w(tag, message);
}
public void v(String tag, String message) {
Log.v(tag, message);
}
public void d(String tag, String message) {
Log.d(tag, message);
}
}
utilizzare questa classe in ogni luogo avete Log.x
chiamate ora.
Secondo passo sarebbe quello di scrivere un test implementazione-doppia Logger
che reindirizza standard output:
public class UnitTestLogger extends Logger{
@Override
public void e(String tag, String message) {
System.out.println("E " + tag + ": " + message);
}
// similar for other methods
}
L'ultimo passo è quello di iniettare UnitTestLogger
anziché Logger
in unit test:
@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest {
private Logger mLogger = new UnitTestLogger();
private SomeClass SUT;
@Before
public void setup() throws Exception {
SUT = new SomeClass(/* other dependencies here */ mLogger);
}
}
Se si desidera essere rigorosamente rigorosi sui concetti OOP, è possibile estrarre un'interfaccia comune per Logger
e UnitTestLogger
.
Detto questo, non ho mai riscontrato la necessità di esaminare le chiamate Log.x
nei test unitari. Sospetto che nemmeno tu ne abbia bisogno. È possibile eseguire unit test in modalità debug e scavalcare il codice di linea per linea in debugger, che è molto più veloce che tentare di indagare uscita logcat ...
Informazione generale:
Se il codice stai testando contiene le chiamate statiche Log.x
ei tuoi test di unità non si bloccano - hai un problema.
Suppongo che tutti i test vengano eseguiti con Robolectric
oppure questa dichiarazione è in build.gradle: unitTests.returnDefaultValues = true
.
Se si eseguono tutti i test con Robolectric
, quindi non è efficiente, ma se tutte le chiamate Android restituiscono valori predefiniti, la suite di test non è affidabile. Ti suggerisco di risolvere questo problema prima di procedere ulteriormente perché ti morderà in futuro in un modo o nell'altro.
Hai scoperto come si fa? Sto affrontando la stessa domanda ora ... –
@IgorGanapolsky, è possibile vedere la mia risposta sotto – Vasiliy