JUnit Test返回lateinit属性 尚未在演示者上初始化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUnit Test返回lateinit属性 尚未在演示者上初始化相关的知识,希望对你有一定的参考价值。
我想创建一个简单的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));
}
}
在AppComponent类中
class PhoneNumberPresenter() : PhoneNumberContract.Handler {
@Inject
lateinit var mUserService: UserService
init {
Application.mInstance.mComponent.inject(this)
}
//.....
mUserService.sendPhoneNumber().....
}
并且测试的错误是“lateinit属性mUserService尚未初始化”
我不使用Dagger进行单元测试,如果我可以避免它,因为我想控制什么是模拟,什么是间谍等等。
你不应该在Dagger中使用任何“Application.mInstance”。看起来你在版本2.10之前使用Dagger - 你应该升级到最新最好的!在@Singleton
@Component(modules = arrayOf(HttpModule::class, AppModule::class))
interface AppComponent {
fun inject(presenter: PhoneNumberPresenter)
}
上有关于android的整个部分
使用Dagger 2.10及更高版本,您可以继承DaggerApplication,然后在活动中使用AndroidInjection.inject(),在自己的类的构造函数上使用@Inject。
https://google.github.io/dagger/android
您的活动应如下所示:
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);
}
}
对于活动测试,您可能应该使用TestApplication而不是真正的Application类吗?有关这方面的一些提示,请参阅public class YourActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
}
。
以上是关于JUnit Test返回lateinit属性 尚未在演示者上初始化的主要内容,如果未能解决你的问题,请参考以下文章
@Autowired lateinit 属性 '' 尚未初始化
kotlin.UninitializedPropertyAccessException:lateinit 属性尚未初始化
UninitializedPropertyAccessException:lateinit 属性尚未初始化
UninitializedPropertyAccessException:lateinit 属性首选项尚未初始化
:kotlin.UninitializedPropertyAccessException:lateinit 属性管理器尚未初始化