我正在对一个类进行单元测试 - AuthenticationService - 负责使用Firebase Auth对用户进行身份验证。我为此目的使用JUnit,Mockito和PowerMock。
我完全嘲笑Firebase Auth,因为我的主要目标是类中包含的逻辑。我的问题在于这个方法:
public void loginWithEmailAndPassword(String email, String password, OnCompletedListener listener) {
if (Strings.isNullOrEmpty(email) || !Pattern.compile(EMAIL_PATTERN).matcher(email).matches()) {
throw new IllegalArgumentException("email field is empty or bad formatted");
}
if (Strings.isNullOrEmpty(password)) {
throw new IllegalArgumentException("password field must be not empty");
}
mFirebaseAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
if (listener != null)
listener.onComplete(new AuthResult(true, null));
} else {
Exception exception = (FirebaseAuthException)task.getException();
Log.e(TAG, exception.getMessage());
if (listener != null) {
AuthResult result = new AuthResult(false, createStatusFromFirebaseException(exception));
listener.onComplete(result);
}
}
});
}
我想测试addOnCompleteListener中传递的lambda方法。 我知道我需要以某种方式调用这个lambda方法,因为Firebase本身永远不会调用它,毕竟我嘲笑Firebase。
问题是:我不知道如何在我的单元测试代码中调用这个lambda方法。 我需要测试是否在侦听器中调用onComplete方法及其参数。
提前致谢。
答案 0 :(得分:2)
你在这里进行真正的单元测试很困难,因为你实际上是在尝试测试两个类,而不仅仅是一个。纯单元测试仅适用于测试的单个类 - 其他一切都被模拟或存根。
这里不太明显的第二课是你传递给OnCompleteListener
的{{1}}。如果您将其分解并单独测试,您的外部类将可以进行适当的单元测试。
如果你这样做,现在你有机会通过传递一个模拟的mFirebaseAuth.signInWithEmailAndPassword().addOnCompleteListener()
来单独测试OnCompleteListener,并检查它是否对它做了正确的事情和模拟Task
您传递给OnCompletedListener
。
总结一下:你需要进行大量的重构才能使这个类能够进行适当的单元测试。