Я написал метод тестирования для проверки этого метода:
public static Completable updateUserProfile(FirebaseUser firebaseUser, UserProfileChangeRequest request){
return Completable.create(emitter -> CompletableTask.assign(emitter, firebaseUser.updateProfile(request)));
}
Метод CompletableTask.assign:
public static <T> void assign(CompletableEmitter emitter, Task<T> task){
CompletableTask completeTask = new CompletableTask(emitter);
task.addOnCompleteListener(completeTask);
task.addOnCompleteListener(completeTask);
task.addOnFailureListener(completeTask);
}
Вот метод тестирования:
@Mock
FirebaseUser firebaseUser;
@Mock
Task<Void> voidTask;
@Mock
UserProfileChangeRequest userProfileChangeRequest;
static <T> void setupTask(Task<T> task) {
when(task.addOnCompleteListener(testOnCompleteListener.capture())).thenReturn(task);
when(task.addOnSuccessListener(testOnSuccessListener.capture())).thenReturn(task);
when(task.addOnFailureListener(testOnFailureListener.capture())).thenReturn(task);
}
@Test
public void updateUserProfile() {
ArgumentCaptor<OnCompleteListener> testOnCompleteListener = ArgumentCaptor.forClass(OnCompleteListener.class);
ArgumentCaptor<OnSuccessListener> testOnSuccessListener = ArgumentCaptor.forClass(OnSuccessListener.class);
ArgumentCaptor<OnFailureListener> testOnFailureListener = ArgumentCaptor.forClass(OnFailureListener.class);
when(firebaseUser.updateProfile(userProfileChangeRequest)).thenReturn(voidTask);
TestObserver<Void> testObserver = FirebaseUserWrapper.updateUserProfile(firebaseUser, userProfileChangeRequest)
.test();
testOnCompleteListener.getValue().onComplete(voidTask);
testOnSuccessListener.getValue().onSuccess(voidTask);
verify(firebaseUser).updateProfile(userProfileChangeRequest);
testObserver.assertNoErrors()
.assertComplete();
}
Итак, в тесте я издеваюсь и проверяю, было ли задание возвращено в onsuccess и oncomplete.
Однако, когда я запускаю тест, я получаю эту ошибку:
org.mockito.exceptions.base.MockitoException: значение аргумента не было
захватил!
из этой строки: testOnSuccessListener.getValue().onSuccess(voidTask);
Выполняя некоторую отладку, я вижу размер этого аргумента в 0 в testOnSuccessListener, а в testOnCompleteListener - 6 (у меня есть 2 других метода теста в том же классе теста).
Не могу понять, почему я получаю эту ошибку в testOnSuccessListener? Есть предложения?