【问题标题】:UnitTest against Firebase ensure callback is fired针对 Firebase 的 UnitTest 确保触发回调
【发布时间】: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


【解决方案1】:

这似乎更像是一个集成测试场景。

如果您想对其进行单元测试,我会执行以下操作:

第 1 步)

使用回调行为创建一个公共类,而不是使用匿名类:

public class MyOnCompleteListener implements OnCompleteListener<AuthResult>() {
      @Override
      public void onComplete(@NonNull Task<AuthResult> task) {
          viewCallback.doSomething();
      }
});

第 2 步)

将您的 createUser 方法更改为:

public void createUser() {

    mAuth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener((Executor) this
                       , new MyOnCompleteListener<AuthResult>() );

}

第 3 步)

如下定义您的测试:

@Test
public void progressBarIsDismissedWhenRegistrationIsSuccessFul() throws Exception {
    String email = "somusername";
    String password = "somePassword";
    viewModelUnderTest.email = email;
    viewModelUnderTest.password = password;

    Task taskMock = mock(Task.class);
    when(mockAuth.createUserWithEmailAndPassword (email, password)).thenReturn(taskMock);

    viewModelUnderTest.createUser();
    verify(mockAuth, times(1)).createUserWithEmailAndPassword(email,password);
    verify(taskMock, times(1)).addOnCompleteListener(any(RegistrationViewModel.class)
          , any(MyOnCompleteListener.class));
}

底线是您验证某个回调已为createUserWithEmailAndPassword 方法注册。

如果您想在不实际调用框架代码的情况下将其作为单元测试,那么您可以做的就是这些。

【讨论】:

  • 感谢您的评论,我设法使用上面的示例代码找到了一个可行的解决方案:)
猜你喜欢
  • 1970-01-01
  • 2014-01-26
  • 2016-09-19
  • 1970-01-01
  • 2019-10-12
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多