gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 19:11:27 25 4
gpt4 key购买 nike

我正在学习 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)。我定义了自定义回调:

   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);
}
}
});
}
}

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

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("test@mail.com");

forgotPasswordPresenter.sendButtonClicked();

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

verify(view).showEmailSent();

}

因此,当涉及到验证(模型).sendEmail...时,它崩溃了,并且 Mockito 出现了这个异常:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 2 matchers expected, 1 recorded: -> at com.example.app.ui.login.ForgotPasswordPresenterTest.sendButtonClicked_shouldShowEmailSent(ForgotPasswordPresenterTest.java:53) This exception may occur if matchers are combined with raw values: //incorrect: someMethod(anyObject(), "raw String"); When using matchers, all arguments have to be provided by matchers. For example: //correct: someMethod(anyObject(), eq("String by matcher"));

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

谁能帮我解决这个问题?我是初学者,想弄明白,但现在真的没有线索。

最佳答案

由于您正在使用 capture() 捕获参数(被视为匹配器),你必须使用 eq对于 verify 中的所有其他原始值.在你的测试中view.getEmail()返回原始值(“test@mail.com”),因此您的验证将更改为:

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

请注意,您现在将验证 view.getEmail()eq 包裹.

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

关于java - Mockito InvalidUseOfMatchersException,当尝试使用自定义回调作为参数对方法进行单元测试时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45162604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com