如何测试使用回调的函数?

用户946947

假设我们有一个回调函数的接口,如下所示:

public interface Model {
    interface UserListener {
        void callback(User user);
    }

    void getUser(String username, UserListener listener);
}

我们有一个方法可以调用作为参数给出的回调:

public class Presenter() {
    ...

    public Presenter(Model model, View view) {
        this.model = model;
        this.view = view;
    }

    public void checkLogin() {
        String username = view.getUsername();
        String password = view.getPassword();

        model.getUser(username, user -> {
            if (user == null) {
                view.loginFailed();
            } else {
                view.loginSuccess(user.getName());
            }
        });
    }
}

我希望按照以下方式对其进行测试:

when(view.getUsername()).thenReturn("abc");
when(view.getPassword()).thenReturn("xyz");
Presenter presenter = new Presenter(view, model);
presenter.checkLogin();

// How do I verify that view.loginFailed() or view.loginSuccess() is called here
...

现在,问题是:在这种情况下,如何测试 (Mockito) 调用 loginFailed() 和 loginSuccess() 的视图?

戴维斯

在 Mockito 中,Answer当对模拟的调用需要做的不仅仅是返回一个值时,您可以使用 an

@ExtendWith(MockitoExtension.class)
public class MockEg {
    public interface Model {
        interface UserListener {
            void callback(User user);
        }
        void getUser(String username, UserListener listener);
    }

    interface User {}

    @Test
    public void aTest() {
        Model model = mock(Model.class);
        User user = mock(User.class);

        doAnswer(new Answer<Void>() {
            @Override
            public Void answer(InvocationOnMock invocation) throws Throwable {
                Model.UserListener listener = invocation.getArgument(1);
                listener.callback(user);
                return null;
            }
        }).when(model).getUser(any(), any());
        ...
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章