如何验证方法是否在模拟类的回调中运行?

时间:2018-01-17 19:28:43

标签: android unit-testing mocking mockito firebase-authentication

我的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没有嘲笑。

2 个答案:

答案 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也是模拟