Android &引用;需要0个匹配器,记录了3个";-为什么需要0个匹配者?
这个问题以前有人问过,但现有的答案并不完全适用于我的情况 我想测试Android &引用;需要0个匹配器,记录了3个";-为什么需要0个匹配者?,android,mockito,matcher,Android,Mockito,Matcher,这个问题以前有人问过,但现有的答案并不完全适用于我的情况 我想测试submitCode()方法: public class VerificationCodeViewModel{ //Input public final ObservableField<String> verificationCode = new ObservableField<>(); //Output public final Observable
submitCode()
方法:
public class VerificationCodeViewModel{
//Input
public final ObservableField<String> verificationCode = new ObservableField<>();
//Output
public final ObservableField<String> requestError = new ObservableField<>();
public final ObservableBoolean loading = new ObservableBoolean();
public final ObservableField<LoginCredentials> loginCredentials = new ObservableField<>();
@NonNull private final Context context;
@NonNull private final UnverifiedUser unverifiedUser;
@NonNull private final CampaignRepository campaignRepository;
@NonNull private final AccountRepository accountRepository;
@NonNull private final VerificationCodeNavigator navigator;
public VerificationCodeViewModel(@NonNull Context context,
@NonNull UnverifiedUser unverifiedUser,
@NonNull CampaignRepository campaignRepository,
@NonNull AccountRepository accountRepository,
@NonNull VerificationCodeNavigator navigator) {
this.context = context;
this.unverifiedUser = unverifiedUser;
this.campaignRepository = campaignRepository;
this.accountRepository = accountRepository;
this.navigator = navigator;
}
public void submitCode() {
loading.set(true);
String sourceCampaign = null;
if (campaignRepository.getCampaign() != null) {
sourceCampaign = campaignRepository.getCampaign().getSource();
}
this.accountRepository.verifyMobileNumber(
this.unverifiedUser,
this.verificationCode.get(),
sourceCampaign,
new AccountDataSource.VerifyMobileNumberCallback() {
@Override
public void onVerificationSuccess(UnverifiedUser.Entity entity) {
loading.set(false);
loginCredentials.set(createLoginCredentials());
navigator.finishActivity(true);
}
@Override
public void onVerificationFailure(@Nullable String message) {
loading.set(false);
requestError.set(message);
}
}
);
}
}
AccountRemoteDataSource.java
public class AccountRepository implements AccountDataSource {
@Override
public void verifyMobileNumber(@NonNull UnverifiedUser unverifiedUser,
@NonNull String verificationCode,
@Nullable String sourceCampaign,
@NonNull VerifyMobileNumberCallback callback) {
this.remoteSource.verifyMobileNumber(unverifiedUser, verificationCode, sourceCampaign, callback);
}
}
public class AccountRemoteDataSource implements AccountDataSource {
@Override
public void verifyMobileNumber(@NonNull UnverifiedUser unverifiedUser,
@NonNull String verificationCode,
@Nullable String sourceCampaign,
@NonNull final VerifyMobileNumberCallback callback) {
accountService().verifyMobileNumber(/*params*/).enqueue(new Callback() {
@Override
public void onResponse(Response response, Retrofit retrofit) {
try{
//parse response
callback.onVerificationSuccess(entity);
} catch (Exception e) {
callback.onVerificationFailure(e.getMessage());
}
}
@Override
public void onFailure(Throwable t) {
callback.onVerificationFailure(t.getMessage());
}
});
}
}
哈哈,找到了!您在测试文件的第六个注释字段中错误地使用了
@Mock ArgumentCaptor
@Mock private ArgumentCaptor<AccountDataSource.VerifyMobileNumberCallback>
verifyMobileNumberCallbackCaptor;
@Mock private ArgumentCaptor,然后对Mockito Mock的下一次调用将触发验证。Mockito在参数匹配器堆栈上看到三个匹配器,用于调用capture
。这就是为什么记录了3个匹配者,预期为0
将注释切换到,您就可以开始了。您确定错误在那一行吗?张贴整个错误please@JuanCruzSoler我已经包含了完整的错误消息,并在代码段中标记了相关行。感谢您迄今为止提供的完整且标记良好的源代码,但除此之外,请发布verifyMobileNumber
的实现。很有可能是最终版
;AccountRepository和verifyMobileNumber
都应该是非最终版本。(我有点惊讶它说的是“记录了3个匹配者”而不是“记录了4个匹配者”,但0预期是一个相当不错的信号,表明你没有验证你认为你是什么。)@JeffBowman谢谢!我已经包括了实现AccountRepository
是viewModel
中的final
字段(删除final
并不能解决问题)AccountRepository
、remoteSource
和verifyMobileNumber()
都不是final
Facepalm!当然,现在一切都有意义了。非常感谢您抽出时间来发现这一点
@Mock private ArgumentCaptor<AccountDataSource.VerifyMobileNumberCallback>
verifyMobileNumberCallbackCaptor;