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

时间:2018-03-05 12:43:16

标签: android mvvm kotlin dagger-2

我想创建一个简单的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));

    }
}

在我的演示者中,我这样做

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;

1 个答案:

答案 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