Ich habe eine Android-App, die Dolch 2 für die Abhängigkeits-Injektion verwendet. Ich benutze auch die neuesten Tools zur Erstellung von Editoren, die eine Build-Variante für Komponententests und eine für Instrumentierungstests ermöglichen. Ich benutze java.util.Random
in meiner App, und ich möchte dies zum Testen verspotten. Die Klassen, die ich teste, verwenden keine Android-Sachen, also sind sie nur normale Java-Klassen.Android Unit Tests mit Dolch 2
In meinem Haupt-Code definiere ich ein Component
in einer Klasse, die die Application
Klasse, aber in den Unit-Tests ein Application
Ich bin nicht mit erstreckt. Ich habe versucht, einen Test Module
und Component
zu definieren, aber Dolch wird Component
nicht erzeugen. Ich habe auch versucht, die Component
verwenden, die ich in meiner Anwendung definiert und Vertauschen der Module
, wenn ich es bauen, aber die Anwendung des Component
hat keine inject
Methoden für meine Testklassen. Wie kann ich eine Testimplementierung von Random
zum Testen bereitstellen?
Hier ist ein Beispielcode:
Anwendung:
public class PipeGameApplication extends Application {
private PipeGame pipeGame;
@Singleton
@Component(modules = PipeGameModule.class)
public interface PipeGame {
void inject(BoardFragment boardFragment);
void inject(ConveyorFragment conveyorFragment);
}
@Override
public void onCreate() {
super.onCreate();
pipeGame = DaggerPipeGameApplication_PipeGame.create();
}
public PipeGame component() {
return pipeGame;
}
}
Modul:
@Module
public class PipeGameModule {
@Provides
@Singleton
Random provideRandom() {
return new Random();
}
}
Basisklasse für Tests:
public class BaseModelTest {
PipeGameTest pipeGameTest;
@Singleton
@Component(modules = PipeGameTestModule.class)
public interface PipeGameTest {
void inject(BoardModelTest boardModelTest);
void inject(ConveyorModelTest conveyorModelTest);
}
@Before
public void setUp() {
pipeGameTest = DaggerBaseModelTest_PipeGameTest.create(); // Doesn't work
}
public PipeGameTest component() {
return pipeGameTest;
}
}
oder:
public class BaseModelTest {
PipeGameApplication.PipeGame pipeGameTest;
// This works if I make the test module extend
// the prod module, but it can't inject my test classes
@Before
public void setUp() {
pipeGameTest = DaggerPipeGameApplication_PipeGame.builder().pipeGameModule(new PipeGameModuleTest()).build();
}
public PipeGameApplication.PipeGame component() {
return pipeGameTest;
}
}
Testmodul:
@Module
public class PipeGameTestModule {
@Provides
@Singleton
Random provideRandom() {
return mock(Random.class);
}
}
Dies wird helfen, https://stackoverflow.com/questions/26939340/how-do-you-override-a-module-dependency-in-a-unit-test-with-dagger-2-0 ? lq = 1 –
Sie sollten vielleicht die Tatsache in Betracht ziehen, dass Dolch nicht für Komponententests empfohlen wird: https://google.github.io/dagger/testing.html –