我想创建一个简单的JUnit测试,测试返回错误,如
kotlin.UninitializedPropertyAccessException:lateinit属性 mInstance尚未初始化
我的测试我将用Java编写。这是测试类。我的演示者和所有课程均使用Kotlin
和Dagger2
撰写RxJava
。
public class PhoneNumberPresenterTest {
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@Mock
private PhoneNumberContract.View view;
@Inject
private PhoneNumberPresenter phoneNumberPresenter;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
phoneNumberPresenter = new PhoneNumberPresenter(this.view);
}
@Test
public void fetchValidDataShouldLoadIntoView() {
SendCodeRequest request = new SendCodeRequest(anyString());
GenericResponse<User> response = new GenericResponse<>();
when(phoneNumberPresenter.mUserService.sendCode(request))
.thenReturn(Observable.just(response));
}
}
在我的演示者中,我这样做
class PhoneNumberPresenter() : PhoneNumberContract.Handler {
@Inject
lateinit var mUserService: UserService
init {
Application.mInstance.mComponent.inject(this)
}
//.....
mUserService.sendPhoneNumber().....
}
在AppComponent类中
@Singleton
@Component(modules = arrayOf(HttpModule::class, AppModule::class))
interface AppComponent {
fun inject(presenter: PhoneNumberPresenter)
}
测试的错误是&#34; lateinit属性mUserService尚未初始化&#34;
答案 0 :(得分:0)
我不会使用Dagger进行单元测试,如果我可以避免它,因为我想控制什么是模拟,什么是间谍等等。
你不应该在Dagger中使用任何“Application.mInstance”。看起来你在版本2.10之前使用Dagger - 你应该升级到最新最好的!在https://google.github.io/dagger/android
上有关于Android的整个部分使用Dagger 2.10及更高版本,您可以继承DaggerApplication,然后在自己的类的构造函数上使用ActivityInjection.inject()和@Inject。
public class MyApplication extends DaggerApplication {
/**
* This is the same as extending from MultiDexApplication.
* @see android.support.multidex.MultiDexApplication
*/
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
@Override
public void onCreate() {
super.onCreate();
// ...
}
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
return DaggerAppComponent.builder().create(this);
}
}
您的活动应如下所示:
public class YourActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
}
对于活动测试,您是否应该使用TestApplication而不是真正的Application类?有关这方面的一些提示,请参阅https://android.jlelse.eu/testing-your-app-with-dagger-2-c91cdc0860fb。