Pro*_*kky 5 android robolectric firebase firebase-authentication firebase-realtime-database
我正在尝试为我的演示者编写一个简单的Robolectric测试,该测试使用Firebase数据库和Firebase Auth.但每次我尝试启动测试时,都会抛出IllegalStateException.
java.lang.IllegalStateException: FirebaseApp with name [DEFAULT] doesn't exist.
at com.google.firebase.FirebaseApp.getInstance(Unknown Source)
at com.google.firebase.FirebaseApp.getInstance(Unknown Source)
at com.google.firebase.auth.FirebaseAuth.getInstance(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
我的测试非常简单
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class LoginPresenterTest {
private LoginPresenter presenter;
private LoginMvpView view;
@Before
public void beforeEachTest() {
presenter = new LoginPresenter();
view = new LoginFragment();
}
@Test
public void attachView_shouldAttachViewToThePresenter() {
presenter.attachView(view);
assertSame(presenter.getMvpView(), view);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的演示者构造函数中,我只是获取Firebase实例.
public LoginPresenter() {
this.firebaseAuth = FirebaseAuth.getInstance();
this.database = FirebaseDatabase.getInstance().getReference();
}
Run Code Online (Sandbox Code Playgroud)
有没有办法将Robolectric与Firebase一起使用?
如果您不在代码中使用它们来测试,则可以通过构造函数注入它们:
public LoginPresenter(FireBaseAuth firebaseAuth, FirebaseDatabase database){
this.firebaseAuth = firebaseAuth;
this.database = database;
}
Run Code Online (Sandbox Code Playgroud)
当你null为他们注入时,记住这是一个非常糟糕的方法,使用null. 更好的方法是使用像Mockito这样的库或使用接口/包装器等。
例如使用一个接口
public interface IDatabase {
public List<String> getData();
}
Run Code Online (Sandbox Code Playgroud)
这LoginPresenter:
public LoginPresenter(FireBaseAuth firebaseAuth, IDatabase database){
this.firebaseAuth = firebaseAuth;
this.database = database;
}
Run Code Online (Sandbox Code Playgroud)
正常执行IDatabase:
public class MyDatabase implements IDatabase {
private FirebaseDatabase database;
public MyDatabase(FirebaseDatabase database) {
this.database = database;
}
public List<String> getDate() {
// Use the FirebaseDatabase for returning the getData
return ...;
}
}
Run Code Online (Sandbox Code Playgroud)
现在可以很容易地使用以下方法来模拟数据库IDatabase:
public class DatabaseMock implements IDatabase {
public List<String> getData() {
// Return the expected data from the mock
return ...;
}
}
Run Code Online (Sandbox Code Playgroud)
从测试中调用它,如下所示:
presenter = new LoginPresenter(FirebaseAuth.getInstance(), new DatabaseMock());
Run Code Online (Sandbox Code Playgroud)