Поля @Inject все равны нулю внутри смоделированного объекта - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь написать тест пользовательского интерфейса с помощью Espresso, у меня есть модель представления, которую мне нужно смоделировать.Но внутри этой смоделированной модели представления есть несколько @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 вводит myField, используя MyFieldModule.

1 Ответ

0 голосов
/ 28 мая 2019

Вы должны использовать 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
}
...