我想将我的领域管理器用于单元测试模块。 我做了
@Singleton
@Component(modules = {
TestApplicationModule.class,
AndroidSupportInjectionModule.class,
TestStoreDataModule.class,
TestUtilsModule.class})
public interface AppComponentTest extends AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
AppComponentTest.Builder application(Application application);
AppComponentTest build();
}
}
然后我想实现
@RunWith(RobolectricTestRunner.class)
@Config(application = TestVerioriApplication.class, sdk=27)
public class BaseVerificationQuestionnaireFragmentTest {
@Inject
RealmManager realmManager;
}
但是realmManager为null。如何使用Dagger 2编写简单的模块测试?我用了匕首模型,但这没有帮助。我的模块包含
@Module(includes = StoreDataModule.class)
public class TestStoreDataModule {
@Provides
@Singleton
public static RealmConfiguration provideRealmConfiguration(RealmConstants realmConstants) {
return new RealmConfiguration.Builder()
.name(realmConstants.getName())
.encryptionKey("Implement this key".getBytes())
.schemaVersion(realmConstants.getSchemaVersion())
.build();
}
@Provides
@Singleton
public static RealmManager provideRealmManager(RealmConfiguration realmConfiguration, SchedulerProvider schedulerProvider) {
return new RealmManager(realmConfiguration, schedulerProvider);
}
}
我尝试了所有来自google的方法,但是我不知道如何从图中注入对象。
答案 0 :(得分:0)
覆盖您的Application
类,在这里您将用TestComponent替换匕首组件实例。然后,通过覆盖需要添加测试应用程序的AndroidJUnitRunner
类来创建自己的测试运行器:
class TestRunner : AndroidJUnitRunner() {
@Throws(InstantiationException::class,IllegalAccessException::class,ClassNotFoundException::class)
override fun newApplication(cl:ClassLoader,className:String, context:Context):Application {
return super.newApplication(cl, TestApplication::class.java.name, context)
}
}
接下来将您的跑步者注册到build.gradle
文件中:
testInstrumentationRunner "com.test.YourTestRunner"
现在,您只需在测试组件中替换要在测试中更改的模块的实现即可。
答案 1 :(得分:0)
好的。 BaseVerificationQuestionnaireFragmentTest
请求字段注入,但它本身并未注入。为此,AppComponentTest
接口必须有这个1 行:
public void inject(BaseVerificationQuestionnaireFragmentTest baseVerificationQuestionnaireFragmentTest);
然后这个方法必须用在像@Before
这样的地方:
TestApplication app = (TestApplication) RuntimeEnvironment.systemContext;
app.appComponentTest.inject(this);
假设 appComponentTest
在 TestApplication
中是公开的。
我以这种方式成功地在它的测试中注入了一个 ViewModel。
请原谅我的 Java。
1 就我而言,Dagger 内容位于 sharedTest
目录中,无法看到 BaseVerificationQuestionnaireFragmentTest
。我创建了一个 InjectableTest
类,我的测试继承自该类,并请求在 init
(即 Kotlin 代码)的 InjectableTest
块中注入。