2013-11-04 14 views
5

次のJUnitテストクラスでGuiceを使用して、モックの依存関係を注入したいと思います。具体的にはresourceです。これどうやってするの?注入された依存関係をモックする方法

テスト

public class SampleResourceTest extends ResourceTest { 

    @Override 
    protected void setUpResources() throws Exception { 
     // when(dao.getSample(eq("SIP"), eq("GA"))).thenReturn(sam); 
     addResource(new SampleResource()); 
    } 

    @Test 
    public void getSampleTest() { 
     Assert.assertEquals(sam, client().resource("/sample/SIP/GA").get(Sample.class)); 
    } 

} 

リソース

@Path("/sample") 
@Produces(MediaType.APPLICATION_JSON) 
public class SampleResource { 

    @Inject 
    private SampleDao samDao; 

    @GET 
    @Path("/{sample}/{id}") 
    public Sample getSample(@PathParam("id") String id) { 
     return samDao.fetch(id); 
    } 

} 
+0

ユニットテストにDAOを注入しますか?あるいは、実際にテストしているクラスにDAOを注入していますか? – rmlan

+0

申し訳ありません、私はユニットテストに 'Resource'を注入し、注入された' Resource'の中で 'DAO'をモックする必要があります – Ari

+0

リソースのコードを表示できますか? DAOはどのように宣言/使用されていますか? – rmlan

答えて

3

1つのオプションは、あなたのGuiceインジェクタを作成するときにDAOクラスにモックDAOのインスタンスをバインドすることです。次に、SampleResourceを追加する場合は、代わりにgetInstanceメソッドを使用してください。このようなもの:

Injector injector = Guice.createInjector(new AbstractModule() { 
     @Override 
     protected void configure() { 
      bind(SampleDao.class).toInstance(mockDao); 
     } 
}); 

addResource(injector.getInstance(SampleResource.class); 
6

別のテストモジュールを使用してGuice注入設定を上書きすることを検討してください。

独自の例を使用して示しますが、ニーズに合わせやすいです。

Module testModule = Modules.override(new ProductionModule()) 
    .with(new AbstractModule(){ 

    @Override 
    protected void configure() { 
     bind(QueueFactory.class).toInstance(spy(new QueueFactory())); 
    } 

}); 

Injector injector = Guice.createInjector(testModule); 
QueueFactory qFactorySpy = injector.getInstance(QueueFactory.class);