5

FirebaseデータベースとFirebase Authを使用するプレゼンター向けの簡単なRobolectricテストを作成しようとしています。しかし、テストを開始しようとするたびに、IllegalStateExceptionがスローされます。FirebaseでのRobolectricアプリケーションテスト

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) 

私のテスト私のプレゼンターのコンストラクタで、私はちょうどFirebaseインスタンスを取得しながら

@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); 
    } 
} 

非常に簡単です。

public LoginPresenter() { 
     this.firebaseAuth = FirebaseAuth.getInstance(); 
     this.database = FirebaseDatabase.getInstance().getReference(); 
    } 

Robolectric with Firebaseを使用する方法はありますか?

+0

?あなたのテストでそれらをしたいですか? –

+0

いいえ、私はまだそれらを必要としません。あなたはそれらを模擬する方法の詳細を教えてください。私はテストするのが初めてです。 – Prokky

答えて

4

あなたはコンストラクタによってそれらを注入することができるテストするために、あなたのコードでそれらを使用しない場合:

public LoginPresenter(FireBaseAuth firebaseAuth, FirebaseDatabase database){ 
    this.firebaseAuth = firebaseAuth; 
    this.database = database; 
} 

、あなたは彼らのためにnullを注入し、これはnullを使用して、非常に貧弱な方法であることを覚えています。 より良い方法は、Mockitoのようなライブラリを使用するか、またはインタフェース/ラッパーなどを使用することです。

などのライブラリーを使用することです。

public LoginPresenter(FireBaseAuth firebaseAuth, IDatabase database){ 
    this.firebaseAuth = firebaseAuth; 
    this.database = database; 
} 

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 ...; 
    } 
} 

そして今、IDatabaseを使用してデータベースを模擬することは非常に簡単です:

インタフェース

public interface IDatabase { 
    public List<String> getData(); 
} 

LoginPresenterを使用

public class DatabaseMock implements IDatabase { 
    public List<String> getData() { 
     // Return the expected data from the mock 
     return ...; 
    } 
} 

のようなテストからそれを呼び出します。firebaseコンポーネントを嘲笑することはできません

presenter = new LoginPresenter(FirebaseAuth.getInstance(), new DatabaseMock()); 
関連する問題