Android 单元测试结果列表<List<Model>> 而不是列表<Model>

Android Unit Testing result List<List<Model>> instead of List<Model>

我已尝试通过 https://medium.com/upday-devs/android-architecture-patterns-part-3-model-view-viewmodel-e7eeee76b73b 进行单元测试。 为什么 Testsubscriber 给出 ListModel 结果而不是 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));
}

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

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

testSubscriber.assertValue(expectedLanguages);