2016-04-13 2 views
1

私はパーサー用のJunitテストを書こうとしています。このパーサーは、選択したファイルから頂点とエッジのグラフを作成します。パーサーでは、必要な頂点を作成するために何度も "VertexImpl"のコンストラクタを呼び出しています。GuiceとMockto for Junits

私がパーサーをテストしているとき、実際の "VertexImpl"オブジェクトを作成したくないので、実際にユニットテストにして欲しいです。

"Mockito"と "Guice"を使用してコンストラクタを呼び出すたびに模擬オブジェクトを作成するにはどうすればよいですか?

+0

JUnitの+ Guiceの+ Mockito = https://github.com/ArcBees/Jukito –

答えて

1

パーサーが特定のオブジェクトを作成したくない場合は、よく。そのようなオブジェクトを作成しないように書き換えます。

あなたのパーサには、そのようなVertexImplsを作成するためにパーサーが使用できるいくつかの「ファクトリ」オブジェクトが必要です。単体テストでは、その工場を "模擬"します。パーサが何をするべきかを完全に制御することができます。

注意:テスト対象のコードは、単体テストと本番用に同じです。唯一の違いは、ユニットテストの設定では、ファクトリオブジェクトが異なっていることです(これを行う方法の依存性注入について読んでみたい)。

+0

だから、私はちょうどのために一時的に私のパーサを変更することになっています単体テスト? –

+0

いいえ。私はそれをより明確にするために答えを更新しました。 – GhostCat

+0

MockitoとGuiceでそれを行う方法に関するチュートリアルはありますか? –

1

あなたのテストクラスではそのような何かを行うことができます。

@Inject 
private YourClassToMock _myMock; 

@Before 
public void setUp() throws Exception { 
    Guice.createInjector(/* Your application modules */, mockModule()) 
     .injectMembers(this); 
} 

private Module mockModule() { 
    return new AbstractModule() { 
     @Override 
     protected void configure() { 
      bind(YourClassToMock.class).toInstance(mock(YourClassToMock.class)); 
     } 
    }; 
} 

フィールド_myMock、YourClassToMockのインスタンスは、このテストのための模擬として注入され、他のフィールドは、生産のように正常に注入されます(アプリケーションモジュールの使用による)。

あなたは、注射を定義することはできません、注意してください二回