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;