【发布时间】:2017-02-15 12:23:11
【问题描述】:
我对 android 和 java 还很陌生。我正在尝试编写一个单元测试来验证 Firebase 方法是否使用正确的参数被调用,并且特定的回调会在成功时触发
public class RegistrationViewModel {
private iRegistrationViewCallback viewCallback;
private FirebaseAuth mAuth;
public String email;
public String password;
public RegistrationViewModel(iRegistrationViewCallback view, FirebaseAuth mockAuth) {
viewCallback = view;
mAuth = mockAuth;
}
public void createUser() {
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener((Executor) this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
viewCallback.doSomething();
}
});
}
public void setEmail(String email) {
this.email = email;
}
public void setPassword(String password) {
this.password = password;
}
}
我的单元测试如下所示:
public class RegistrationViewModelUnitTest {
private RegistrationViewModel viewModelUnderTest;
private iRegistrationViewCallback mockView;
private FirebaseAuth mockAuth;
@Before
public void SetUp() {
mockView = mock(iRegistrationViewCallback.class);
mockAuth = mock(FirebaseAuth.getInstance().getClass());
viewModelUnderTest = new RegistrationViewModel(mockView,mockAuth);
}
@Test
public void progressBarIsDismissedWhenRegistrationIsSuccessFul() throws Exception {
String email = "somusername";
String password = "somePassword";
viewModelUnderTest.email = email;
viewModelUnderTest.password = password;
viewModelUnderTest.createUser();
verify(mockAuth).createUserWithEmailAndPassword(email,password);
verify(mockView).doSomething();
}
}
verify(mockView).doSomething(); 显然失败了。
验证viewCallback.doSomething(); 是否被成功调用的最佳方法是什么。我应该以某种方式存根onComplete吗?还是有其他方法可以做到这一点?我曾想过将 Firebase 代码放在接口后面,但仍然无法弄清楚如何验证回调是否被触发。
我正在使用 Mockito 进行模拟。
【问题讨论】:
-
能否添加createUserWithEmailAndPassword方法的实现?
-
另外,FirebaseAuth 是单例吗?
-
据我所知,这是 firebase sdk 的一部分,代码不公开。 developers.google.com/android/reference/com/google/firebase/…
-
如果您正在模拟 FirebaseAuthentication 单例,您将不会从中获得任何回调,除非您自己将其安排为模拟的行为。您必须说明调用 createUserWithEmailAndPassword 时会发生什么。您可以使用 Mockito 中的
when函数来做到这一点。
标签: android unit-testing firebase mockito firebase-authentication