我的Android代码中有一个实用程序类,用于处理用户的身份验证。我正在使用Mokcito为此类编写单元测试,以验证如果新用户的创建成功或失败,将通知侦听器。以下是此实用程序类的方法之一:
public void createNewUser(String email, String password) {
firebaseAuth.createUserWithEmailAndPassword(email, password)
.addOnSuccessListener(authResult -> {
authListener.newUserCreated();
})
.addOnFailureListener(e -> {
authListener.failedCreatingNewUser();
});
}
我在嘲笑FirebaseAuth
,我想验证是否已调用authListener.newUserCreated()
。我已经尝试使用深层存根和参数捕获器来处理firebaseAuth.createUserWithEmailAndPassword
上的链式方法调用,但我无法弄清楚如何使其工作。
更新
这是我的测试类,测试了这个方法:
public class AuthUtilsTest {
private static final String USERNAME = "USERNAME";
private static final String PASSWORD = "PASSWORD";
@Mock
private FirebaseAuth firebaseAuth;
@Mock
private FirebaseFirestore firebaseFirestore;
@Mock
private BaseEncoding base64;
@Mock
private PreferencesRepo preferencesRepo;
@Mock
private AuthUtilsContract.EventListener eventListener;
private AuthUtils authUtils;
@Before
public void setupAuthUtils() {
MockitoAnnotations.initMocks(this);
authUtils = new AuthUtils(
preferencesRepo,
firebaseAuth,
firebaseFirestore,
base64
);
authUtils.takeEventListener(eventListener);
}
@Test
public void failureCreatingNewUserTellsListener() {
Task<AuthResult> failedTask = Tasks.forException(new Exception("fail"));
when(firebaseAuth.createUserWithEmailAndPassword(anyString(), anyString())).thenReturn(failedTask);
authUtils.createNewUser(USERNAME, PASSWORD);
verify(eventListener).failedCreatingNewUser();
}
}
抛出异常
java.lang.ExceptionInInitializerError at com.google.android.gms.tasks.zzn.addOnSuccessListener(未知来源) ...引起:java.lang.RuntimeException:方法getMainLooper in android.os.Looper没有嘲笑。
答案 0 :(得分:1)
使用Mockito.when使createUserCall返回一个模拟的Task。 然后Mockito.verify在任务上捕获添加侦听器调用的参数。
根据您的心愿测试捕获的参数(这就像单元测试中的单元测试,捕获的参数是您正在测试的新类)。
此方法实际上不会测试是否调用了侦听器。只是调用了add listener方法,并且回调在调用
时执行了它们应该执行的操作verify(mockTask).addOnSuccessListener(listenerCaptor.capture());
OnSuccessListener<Auth> newObjectUnderTest = listenerCaptor.getValue();
//ACT
newObjectUnderTest.onSuccess(auth);
//ASSERT
verify(authListener).newUserCreated();
答案 1 :(得分:0)
使用Mockito.when使createUserCall返回已经完成的Task<AuthResult>
。
然后Mockito.verify认为authListener应该做的假设authListener也是模拟