2016-05-04 4 views
1

クラスは次のようになります。どのようにユニットテスト(Guiceのを使用して)、フィールドインジェクションを持つクラスをする

public class SomeAdapter { 

@Inject 
HttpService httpService; 

@Inject 
Configuration configuration; 

public SomeAdapter() 
{ 
    GuiceInjector.getInjector().injectMembers(this); 
} 

public String getBaseUrl() 
{ 
    return configuration.getProtocol()+ "://" + some.getServer() + ":" + configuration.getPort(); 
    } 
} 

私はmockitoフレームワークからInjectMocksを試してみましたが、それはreliable.Wouldが作成していないようですAbstractModuleを拡張する別個のテストモジュールが必要ですか?

+3

テスト対象のクラスは、Guice API(プロダクションクラスのどこにも表示されない)を悪用しています。コンストラクタ内のコードが削除された場合、クラスは模擬依存の注入をサポートする任意の模倣ライブラリ(EasyMock、Mockito、JMockitなど)でテスト可能である必要があります。 –

+0

@Rogérioなので、 'GuiceInjector.getInjector()。injectMembers(this)'はコンストラクタ内に表示されてはいけません。 –

+1

はい、依存性注入の全体のポイントは、クラスの依存関係を別の外部エンティティ(DIフレームワーク/コンテナ、およびDI構成ファイルまたはクラス - モジュール)に移動することです。 Guiceの場合)。プロダクションクラス自体には、たいてい '@Iject'のようなメタデータアノテーションが含まれていなければなりません。 –

答えて

3

私は、クラスの外に依存関係を注入することをお勧めします(それは単一責任の原則に従います)。嘲笑の依存関係を受け入れるように

@RunWith(MockitoJUnitRunner.class) 
public class SomeAdaptorTest { 

    @Inject 
    Configuration configuration; 

    @InjectMocks 
    SomeAdaptor adaptor = new SomeAdaptor(); 

    @Before 
    public void setUp() { 
    when(configuration.getId()).thenReturn(5); 
    } 
    ... 

それとも別のコンストラクタを作成し、民間のパッケージ、:そして、あなたは標準Mockitoを使用する場合があります。

関連する問題