- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 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/
我的测试用例出现以下错误: junit.framework.AssertionFailedError: Exception occured : org.mockito.exceptio
我正在使用 java spring boot 并尝试在单元测试中为 AWS s3 存储桶编写模拟。以下是在执行测试时导致一些问题的代码 @Mock AmazonS3 s3client;
我已经尝试调试这段代码一段时间了,但仍然没有成功。我继续专门为此代码抛出“InvalidUseOfMatchersException”: 对于设置: service = mock(Se
import org.mockito.Mockito; public class Scratch2 { public static class Foo { } public interface Cus
我在使用mockito 2.23.4、junit4 和springrunner 测试方法时遇到困难。我不断收到 InvalidUseOfMatchersException 即使代码对我来说看起来非常好
我目前在使用 Mockito 时遇到问题。但首先这是我的代码,它创建了 Mockito 提示的模拟: @Test public void testRestEndpointGeneration(
我有这个 TestNG 测试方法代码: @InjectMocks private FilmeService filmeService = new FilmeServiceImpl(); @Mock p
我正在使用mockito,并且面临与匹配器参数相关的问题。 我遇到了这个异常: org.mockito.exceptions.misusing.InvalidUseOfMatchersExceptio
我正在学习 Android MVP 架构并尝试使用 Mockito/JUnit 测试一些方法。我正在从本教程中学习: https://codelabs.developers.google.com/co
我有以下模拟对象: @Mock ObjectMapper objectMapper = new ObjectMapper(); 然后我写了一些 mock 逻辑,声称我做错了: Mockito.when
我正在使用 mockito 进行测试,但我遇到了这个问题: org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid
我有一组测试来验证我们的 Android 应用程序中的某些功能。部分代码负责将某些字符串放入某些 TextView 中。所以我想创建模拟的 TextView 对象以在测试时使用: public sta
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:在此处检测到错误的参数匹配器: 我在对以下静态方法执行 powermocki
我想模拟我的 PermissionHostCompat 类的操作 requestPermission(@NonNull String Permission, int requestCode) 。 pu
我对mockito完全陌生,我已经尝试了很多在网上找到的解决方案,但我仍然无法解决这个问题。我什至不确定是什么原因造成的。我需要为一个非常成熟的代码创建一个模拟测试,我不允许更改该代码。我需要模拟的代
我有这个测试 @Test public void addVacancy() throws Exception{ Vacancy mockVacancy = Mockito.mock(V
我正在尝试使用mockito的ArgumentCaptor类来捕获一些参数,然后对其进行一些验证。但它抛出了一个异常。 这就是打印的错误消息。 org.mockito.exceptions.misus
我在构建测试的 when-then 部分时遇到了问题。运行测试时出现以下错误。 我已经查看了这个 SO 链接 ( Mockito: InvalidUseOfMatchersException ) 并重
我最近在我的项目中将 Maven Surefire 插件升级到版本 v2.14.1(从 v2.6)。升级后,Mockito 开始在所有 JUnit 测试中抛出 InvalidUseOfMatchers
在我的 JUnit 类中,我有以下代码: @Mock private HttpServletRequest servletRequest; @Mock WidgetHelper widgetHelpe
我是一名优秀的程序员,十分优秀!