JUnit Test返回lateinit属性 尚未在演示者上初始化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUnit Test返回lateinit属性 尚未在演示者上初始化相关的知识,希望对你有一定的参考价值。

我想创建一个简单的JUnit测试,测试返回一个错误就好了

kotlin.UninitializedPropertyAccessException:lateinit属性mInstance尚未初始化

我的测试我将用Java编写。这是测试类。我的主持人和所有课程都是用KotlinDagger2写的。

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 属性管理器尚未初始化

从 firebase 获取数据:lateinit 属性 currentUser 尚未初始化