Mockito InvalidUseOfMatchersException,当尝试使用自定义回调作为参数对方法进行单元测试时

黑鸟

我正在学习 Android MVP 架构并尝试使用 Mockito/JUnit 测试一些方法。我从本教程中学习:

https://codelabs.developers.google.com/codelabs/android-testing/index.html?index=..%2F..%2Findex

我在我的 Android MVP 架构类型应用程序中测试 Presenter 方法时遇到问题。

这是我的 Presenter 类:

public class ForgotPasswordPresenter implements ForgotPasswordMVP.Presenter{
private ForgotPasswordMVP.View view;
private ForgotPasswordMVP.Model model;


public ForgotPasswordPresenter(FirebaseAuthService firebaseAuthService, ForgotPasswordMVP.Model model) {
    this.model = model;
}

@Override
public void setView(ForgotPasswordMVP.View view) {
    this.view = view;
}

@Override
public void sendButtonClicked() {

    if(view != null) {
        view.showProgressBar();
        model.sendEmail(view.getEmail(), new 
        ForgotPasswordMVP.Model.SendForgotEmailCallback() {
            @Override
            public void onEmailSent(boolean sent) {
                if(sent) {
                    view.hideProgressBar();
                    view.showEmailSent();
                }
                else{
                //show some error on UI
                }
            }
        });
    }
  }
}

这是 MVP.Model 结构的契约接口。我定义了自定义回调:

   interface Model{
   interface SendForgotEmailCallback {
        void onEmailSent(boolean sent);
    }

    void sendEmail(String email, @NonNull SendForgotEmailCallback SendForgotEmailCallback) ;
}

在我的模型中,我做这样的事情,我只是使用 Firebase 来重置密码:

public class ForgotPasswordModel implements ForgotPasswordMVP.Model{

private FirebaseAuthService firebaseAuthService;

public ForgotPasswordModel(FirebaseAuthService firebaseAuthService) {
    this.firebaseAuthService = firebaseAuthService;
}

@Override
public void sendEmail(String email, @NonNull final SendForgotEmailCallback SendForgotEmailCallback) {
    firebaseAuthService.sendPasswordResetEmail(email).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
                if(task.isSuccessful()){
                    SendForgotEmailCallback.onEmailSent(true);
                }
                else{
                    SendForgotEmailCallback.onEmailSent(false);
                }
        }
    });
}
}

现在,我想测试负责发送电子邮件的方法,只需单击发送按钮。这是我的测试原型:

public class ForgotPasswordPresenterTest {

@Mock
ForgotPasswordMVP.Model model;

@Mock
ForgotPasswordMVP.View view;

@Mock
FirebaseAuthService firebaseAuthService;

@Captor
private ArgumentCaptor<ForgotPasswordMVP.Model.SendForgotEmailCallback> sendForgotEmailCallbackArgumentCaptor;


private ForgotPasswordPresenter forgotPasswordPresenter;

@Before
public void setupForgotPasswordPresenter(){
    MockitoAnnotations.initMocks(this);

    forgotPasswordPresenter = new ForgotPasswordPresenter(firebaseAuthService, model);
    forgotPasswordPresenter.setView(view);
}

  @Test
public void sendButtonClicked_shouldShowEmailSent(){

    when(view.getEmail()).thenReturn("[email protected]");

    forgotPasswordPresenter.sendButtonClicked();

    verify(model).sendEmail(view.getEmail(), sendForgotEmailCallbackArgumentCaptor.capture());
    sendForgotEmailCallbackArgumentCaptor.getValue().onEmailSent(true);

    verify(view).showEmailSent();

}

}

因此,当涉及到 verify(model).sendEmail ... 时,它崩溃了,并且出现了 Mockito 的这个异常:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:参数匹配器的使用无效!预期 2 个匹配器,记录 1 个:-> 在 com.example.app.ui.login.ForgotPasswordPresenterTest.sendButtonClicked_shouldShowEmailSent(ForgotPasswordPresenterTest.java:53) 如果匹配器与原始值组合,则可能发生此异常://不正确: ), "原始字符串"); 使用匹配器时,所有参数都必须由匹配器提供。例如: //correct: someMethod(anyObject(), eq("String by matcher"));

有关更多信息,请参阅 Matchers 类的 javadoc。

谁能帮我这个?我是初学者,想弄清楚,但现在真的没有线索。

阿布巴卡

由于您正在使用capture()(被视为匹配器)捕获参数,因此您必须eqverify. 在您的测试中view.getEmail()返回原始值(“[email protected]”),因此您的验证将更改为:

verify(model).sendEmail(eq(view.getEmail()), sendForgotEmailCallbackArgumentCaptor.capture());

请注意,您现在view.getEmail()将使用eq.

需要记住的一件好事是:如果您对任何方法参数使用匹配器,则应使用匹配器验证所有参数(eq用于原始值)。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 Mockito|Android 对调用私有回调的方法进行单元测试

来自分类Dev

使用Mockito进行单元测试LazyLogging

来自分类Dev

使用Mockito对POJO进行单元测试

来自分类Dev

使用Mockito测试回调参数

来自分类Dev

Mockito风格化anyXXX方法进行单元测试

来自分类Dev

Mockito风格化anyXXX方法进行单元测试

来自分类Dev

使用Mockito在单元测试中检查通过的参数

来自分类Dev

使用Mockito进行Retrofit 2 api调用的单元测试

来自分类Dev

如何使用Mockito对图节点进行单元测试?

来自分类Dev

使用Mockito库进行Scala单元测试

来自分类Dev

使用 Mockito 对基于 Guice 的类进行单元测试

来自分类Dev

使用 Mockito 对 Realm 包装的 LiveData 进行单元测试

来自分类Dev

使用 mockito 创建单元测试

来自分类Dev

如何使用 Mockito 通过单元测试?

来自分类Dev

具有类型为vararg参数的Mockito when子句-使用anyVararg进行单元测试

来自分类Dev

使用Mockito对单元进行流畅的界面测试

来自分类Dev

如何使用JUnit和Mockito测试自定义JsonSerializer

来自分类Dev

Mockito问题-InvalidUseOfMatchersException

来自分类Dev

Mockito-InvalidUseOfMatchersException

来自分类Dev

当使用InvalidUseOfMatchersException的Mockito强制CloneNotSupportedException的在复制()方法被测试的junit

来自分类Dev

使用Mockito测试异常

来自分类Dev

使用 Mockito 测试 LoginController

来自分类Dev

使用Mockito进行JUnit测试

来自分类Dev

使用Mockito进行测试服务

来自分类Dev

条件查询Mockito单元测试-NullPointerException

来自分类Dev

Mockito单元测试中的NullPointerException

来自分类Dev

条件查询Mockito单元测试-NullPointerException

来自分类Dev

单元测试 MapReduce - Junit Mockito

来自分类Dev

如何/应该用Mockito对EventBus事件进行单元测试?

Related 相关文章

  1. 1

    使用 Mockito|Android 对调用私有回调的方法进行单元测试

  2. 2

    使用Mockito进行单元测试LazyLogging

  3. 3

    使用Mockito对POJO进行单元测试

  4. 4

    使用Mockito测试回调参数

  5. 5

    Mockito风格化anyXXX方法进行单元测试

  6. 6

    Mockito风格化anyXXX方法进行单元测试

  7. 7

    使用Mockito在单元测试中检查通过的参数

  8. 8

    使用Mockito进行Retrofit 2 api调用的单元测试

  9. 9

    如何使用Mockito对图节点进行单元测试?

  10. 10

    使用Mockito库进行Scala单元测试

  11. 11

    使用 Mockito 对基于 Guice 的类进行单元测试

  12. 12

    使用 Mockito 对 Realm 包装的 LiveData 进行单元测试

  13. 13

    使用 mockito 创建单元测试

  14. 14

    如何使用 Mockito 通过单元测试?

  15. 15

    具有类型为vararg参数的Mockito when子句-使用anyVararg进行单元测试

  16. 16

    使用Mockito对单元进行流畅的界面测试

  17. 17

    如何使用JUnit和Mockito测试自定义JsonSerializer

  18. 18

    Mockito问题-InvalidUseOfMatchersException

  19. 19

    Mockito-InvalidUseOfMatchersException

  20. 20

    当使用InvalidUseOfMatchersException的Mockito强制CloneNotSupportedException的在复制()方法被测试的junit

  21. 21

    使用Mockito测试异常

  22. 22

    使用 Mockito 测试 LoginController

  23. 23

    使用Mockito进行JUnit测试

  24. 24

    使用Mockito进行测试服务

  25. 25

    条件查询Mockito单元测试-NullPointerException

  26. 26

    Mockito单元测试中的NullPointerException

  27. 27

    条件查询Mockito单元测试-NullPointerException

  28. 28

    单元测试 MapReduce - Junit Mockito

  29. 29

    如何/应该用Mockito对EventBus事件进行单元测试?

热门标签

归档