【问题标题】:Android Unit Testing result List<List<Model>> instead of List<Model>Android 单元测试结果 List<List<Model>> 而不是 List<Model>
【发布时间】:2017-05-19 09:15:56
【问题描述】:

我已尝试通过https://medium.com/upday-devs/android-architecture-patterns-part-3-model-view-viewmodel-e7eeee76b73b 进行单元测试。 为什么 Testsubscriber 给出 ListModel 结果的 List 而不是 ListModel ?

我的测试

public class MainViewModelTest {

@Mock
private IDataModel mDataModel;

private MainViewModel mMainViewModel;

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);

}

@After
public void tearDown() throws Exception {

}

@Test
public void testGetSupportedLanguages_emitsCorrectLanguages() {
    Language de = new Language("German", LanguageCode.DE);
    Language en = new Language("English", LanguageCode.EN);
    List<Language> languages = Arrays.asList(de, en);

    Observable<List<Language>> mockObservable = Observable.just(languages);

    doReturn(mockObservable).when(mDataModel).getObservableSupportedLanguages();

    Language hr = new Language("Slovakian", LanguageCode.HR);
    List<Language> expectedLanguages = Arrays.asList(de, en, hr);

    mMainViewModel = new MainViewModel(mDataModel, new ImmediateSchedulerProvider());
    TestSubscriber<List<Language>> testSubscriber = new TestSubscriber<>();

    mMainViewModel.getObservableSupportedLanguages().subscribe(testSubscriber);

    testSubscriber.assertNoErrors();
    testSubscriber.assertReceivedOnNext(expectedLanguages); //here i get List<List<Language>> instead of one List<Language>


}

}

在 MainViewModel 中

 @NonNull
public Observable<List<Language>> getObservableSupportedLanguages() {
    return mDataModel.getObservableSupportedLanguages();
}

在数据模型中

@NonNull
@Override
public Observable<List<Language>> getObservableSupportedLanguages() {
    return Observable.fromCallable(this::getLanguages);
}

@NonNull
private List<Language> getLanguages() {
    return Arrays
            .asList(new Language("English", LanguageCode.EN),
                    new Language("German", LanguageCode.DE),
                    new Language("Slovakian", LanguageCode.HR));
}

【问题讨论】:

    标签: android unit-testing observable rx-android


    【解决方案1】:

    使用assertReceivedOnNext,您可以断言从Observable 发出的项目的完整序列,因此它是一个元素列表。

    如果您的 Observable 只发出一个元素(它本身就是一个项目列表),您可以将断言更改为:

    testSubscriber.assertValue(expectedLanguages); 
    

    【讨论】:

    • 感谢您的回答。我可以只取第一个发射的元素吗?
    • 是的,有一种方法可以获取所有排放的列表。检查车 javadoc :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 2013-07-04
    • 1970-01-01
    相关资源
    最近更新 更多