【问题标题】:Unit test a class that uses Firebase Auth对使用 Firebase Auth 的类进行单元测试
【发布时间】:2018-03-17 18:57:57
【问题描述】:

我正在单元测试一个类 - AuthenticationService - 负责使用 Firebase Auth 对用户进行身份验证。为此,我正在使用 JUnit、Mockito 和 PowerMock。

我完全是在模拟 Firebase 身份验证,因为我的主要目标是类中包含的逻辑。我的问题在于这种方法:

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 方法,以及它的参数。

提前致谢。

【问题讨论】:

    标签: android unit-testing firebase mockito powermock


    【解决方案1】:

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

    这里不是很明显的第二个类是OnCompleteListener,您将传递给mFirebaseAuth.signInWithEmailAndPassword().addOnCompleteListener()。如果您将其分解并单独测试,您的外部类将可以进行正确的单元测试。

    如果你这样做,现在你有机会通过传递一个模拟的 Task 并检查它是否正确地使用它和你的模拟 OnCompletedListener 来对 OnCompleteListener 自己进行单元测试传递给loginWithEmailAndPassword

    总而言之:您需要在此处进行大量重构,以使此类能够进行适当的单元测试。

    【讨论】:

    • 谢谢大佬,注意了。所以基本上我必须为 OnCompleteListener 创建一个单独的类(和文件),并在 AuthenticationService 之外对其进行单元测试。这确实让事情变得更容易,但类的数量会激增,因为 Firebase 只是提供异步方法。
    • 是的,这就是异步回调的工作方式。不过,一切都是异步的,这是有原因的(当您有时间阅读时):medium.com/google-developers/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2019-04-27
    • 2017-05-17
    相关资源
    最近更新 更多