单元测试使用Firebase Auth的类

时间:2018-03-17 18:57:58

标签: android unit-testing firebase mockito powermock

我正在对一个类进行单元测试 - 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方法及其参数。

提前致谢。

1 个答案:

答案 0 :(得分:2)

你在这里进行真正的单元测试很困难,因为你实际上是在尝试测试两个类,而不仅仅是一个。纯单元测试仅适用于测试的单个类 - 其他一切都被模拟或存根。

这里不太明显的第二课是你传递给OnCompleteListener的{​​{1}}。如果您将其分解并单独测试,您的外部类将可以进行适当的单元测试。

如果你这样做,现在你有机会通过传递一个模拟的mFirebaseAuth.signInWithEmailAndPassword().addOnCompleteListener()来单独测试OnCompleteListener,并检查它是否对它做了正确的事情和模拟Task您传递给OnCompletedListener

总结一下:你需要进行大量的重构才能使这个类能够进行适当的单元测试。