如何测试RxJava Flat Map内部的功能? [英] How to test function inside RxJava flatMap?

查看:0
本文介绍了如何测试RxJava Flat Map内部的功能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在演示者中有以下方法。

public void addNote(int customerId, String body) {
    disposables = RxUtil.initDisposables(disposables);

    if (TextUtils.isEmpty(body)) {
        view.showNoteTextEmpty();
        return;
    }

    if (customerId == Constants.ZERO) {
        view.showNoteError("There is a problem with adding note. Try again!");
        return;
    }

    Disposable disposable = userPrefRepository.getLoggedInUser()
        .subscribeOn(Schedulers.io())
        .map(user -> getNote(body, user))
        .flatMap(note -> customersRepository.addNote(customerId, note))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(response -> {
            if (response.isSuccessful()) {
                view.onNoteAdded();
            } else if (response.code() == 401) {
                view.handleUnauthorisedError();
            } else {
                view.onNoteNotAdded();
            }
        }, view::handleError);

    disposables.add(disposable);
}

现在我想使用以下类对其进行单元测试:

@RunWith(PowerMockRunner.class) @PrepareForTest(TextUtils.class)
public class NoteDetailsPresenterTest extends BaseTest {

    @Rule TrampolineSchedulerRule trampolineSchedulerRule = new  TrampolineSchedulerRule();

    @Mock CustomersRepository customersRepository;
    @Mock UserRepository userRepository;
    @Mock RolesManager rolesManager;
    @Mock NoteDetailsPresenter.View view;

    private NoteDetailsPresenter presenter;

    @Before
    public void setUp() {
        mockTextUtils();
        presenter = new NoteDetailsPresenter(customersRepository, userRepository, rolesManager);
        presenter.setView(view);
    }

    @Test
    public void shouldAddNote() {
        // Given
        User user = User.newBuilder()
            .withUserId(1)
            .build();

        // When
        Mockito.when(userRepository.getLoggedInUser()).thenReturn(Single.just(user));
        Note note = presenter.getNote("Note body", user);
        Response<Note> response = Response.success(200, note);
        Mockito.when(customersRepository.addNote(1, note)).thenReturn(Single.just(response));
        presenter.addNote(1, "Note body");

        // Then
        Mockito.verify(view).onNoteAdded();
    }
}

但失败,出现以下异常:

想要但未调用: View.onNoteAdded(); ->在com.anstar.presentation.notes.NoteDetailsPresenterTest.shouldAddNote(NoteDetailsPresenterTest.java:56)

但是,与此模拟还有其他交互: View.handleError( 异常:映射器返回的Single为空 ); ->在io.reactivex.internal.observers.ConsumerSingleObserver.onError(ConsumerSingleObserver.java:46)

我怎样才能解决这个问题?是否存在与映射和平面映射转换有关的问题?

推荐答案

似乎无法读取模拟。尝试将any()放在参数上:

而不是这个:

Mockito.when(customersRepository.addNote(1, note)).thenReturn(Single.just(response));

使用any()

Mockito.when(customersRepository.addNote(anyInt(), any(Note.class))).thenReturn(Single.just(response));

为什么模拟无法阅读?

如果参数是原始数据类型(字符串、整型、双精度等),则只需传递准确的参数(在本例中,第一个参数为整数1),就会读取模拟。然而,在对象(在您的例子中是Note对象)中,即使您有相同的完全相同的参数,它们也会有不同的hashCode(),因此无法读取模拟。解决方案是接受指定类类型的any()参数:any(Note.class)

这篇关于如何测试RxJava Flat Map内部的功能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆