gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 09:29:28 24 4
gpt4 key购买 nike

我的 Android 代码中有一个实用程序类,用于处理用户身份验证。我正在使用 Mokcito 为此类编写单元测试,以验证是否在新用户创建成功或失败时通知监听器。这是此实用程序类的方法之一:

public void createNewUser(String email, String password) {
firebaseAuth.createUserWithEmailAndPassword(email, password)
.addOnSuccessListener(authResult -> {
authListener.newUserCreated();
})
.addOnFailureListener(e -> {
authListener.failedCreatingNewUser();
});
}

我正在模拟 FirebaseAuth,我想验证 authListener.newUserCreated() 是否已被调用。我曾尝试使用深层 stub 和参数捕获器来处理 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(Unknown Source) ... Caused by: java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked.

最佳答案

使用 Mockito.when 使 createUserCall 返回模拟任务。然后 Mockito.verify 在任务上捕获参数以添加监听器调用。

按照您的意愿测试捕获的参数(这就像单元测试中的单元测试,捕获的参数是您的新被测类)。

此方法实际上不会测试是否调用了监听器。只是调用了添加监听器方法,并且回调在调用时执行它们应该执行的操作

verify(mockTask).addOnSuccessListener(listenerCaptor.capture());
OnSuccessListener<Auth> newObjectUnderTest = listenerCaptor.getValue();

//ACT
newObjectUnderTest.onSuccess(auth);

//ASSERT
verify(authListener).newUserCreated();

关于android - 如何验证方法是否在模拟类的回调中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48308609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com