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);
我已尝试通过 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);