@Inject字段在模拟对象中都为空

时间:2019-05-28 13:09:14

标签: android mockito viewmodel android-espresso dagger-2

我正在尝试使用Espresso编写UI测试,我有一个需要模拟的视图模型。但是在这个模拟的viewmodel中,有几个@Inject字段为null,这会带来各种麻烦。

这是视图模型本身(为了简单起见,名称已更改,但代码完全相同)

public class MyViewModel extends ViewModel {

    private final MyFieldRepository myFieldRepository;

    @Inject
    public MyViewModel(MyFieldRepository myField) {
        this.myFieldRepository = myField; //remains null
    }

    public void start() { //NPE here
        myFieldRepository.startAPI() //... async call code
    }
}

视图模型Dagger模块

@Module
public class MyViewModelModule {
    @Provides
    @IntoMap
    @ViewModelKey(MyViewModel.class)
    public ViewModel providesMyViewModel() {
        MyViewModel myViewModel = Mockito.mock(MyViewModel.class);
        return pinPadViewModel;
    }
}

最后是现场模块(我想注入)

@Module
public class MyFieldRepositoryModule {
    @Provides
    @AppScoped
    public MyFieldRepository providesMyField() {
        MyFieldRepository myField = Mockito.mock(MyFieldRepository.class);
        return myField;
    }
}

这是组件代码:

@AppScoped
@Component(modules = {
        MyViewModelModule.class,
        MyFieldModule.class,
})

public interface TestAppComponent extends AndroidInjector<TestApp> {
    @Component.Builder
    interface Builder {

        @BindsInstance
        Builder application(Application application);

        TestAppComponent build();
    }
}

我想为Dagger使用myField注入MyFieldModule的方法。

1 个答案:

答案 0 :(得分:0)

您必须使用ViewModelProvider.Factory提供依赖项

@Singleton
class ViewModelFactory @Inject constructor(private val viewModels: MutableMap<Class<out ViewModel>, Provider<ViewModel>>) : ViewModelProvider.Factory {

    override fun <T : ViewModel> create(modelClass: Class<T>): T = viewModels[modelClass]?.get() as T
}