【问题标题】:@Inject fields are all null inside mocked object@Inject 字段在模拟对象内都是空的
【发布时间】:2019-05-28 13:09:14
【问题描述】:

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

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

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

@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 使用 MyFieldModule 注入 myField

【问题讨论】:

  • 可以分享组件代码吗?
  • @VishalPawar 完成
  • 您确定问题中的 mockito 标签吗?您的问题似乎与 JUnit 测试无关。

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


【解决方案1】:

你必须使用 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多