我正在尝试使用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
的方法。
答案 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
}