2016-04-28 15 views
1

私のクラスは私が嘲笑しようとしています。フィールドとしてのプリミティブを持つクラスの@InjectMocks

private MemcachedClient memcachedClient; 

private CachedObjectFactory cachedObjectFactory; 

private int cacheTimeToLive; 

private boolean hasCert; 

@Autowired 
public MyClass(CachedObjectFactory cachedObjectFactory, 
         MemcachedClient memcachedClient, 
         @Value("${cache.ttl.in.second}") int cacheTimeToLive, 
         @Value("${hasCert}") boolean hasCert) { 
    this.cachedObjectFactory = cachedObjectFactory; 
    this.memcachedClient = memcachedClient; 
    this.cacheTimeToLive = cacheTimeToLive; 
    this.hasCert = hasCert; 
} 

私は@InjectMocksを使用する場合(1がないため)、それはデフォルトコンストラクタで初期化する方法を見つけ出すことができないと文句を言い。私はmockitoがこれを作成するのに使うことができると思うが、プリミティブ(boolean/cacheTimeToLive)をどのように注入するのか分からない。私のテストでこれを行う方法はありますか?

+3

テストで@Beforeメソッドのクラスを初期化するのはどうですか? 'myClass = new MyClass(mockedCachedObjectFactory、mockedMemcachedClient、intValue、boolValue)'? –

+1

あなたはそのクラスを模擬しようとしていません、あなたは自分のフィールドにモックを注入しようとしていますか? –

+1

+1 to dur; InjectMocksはあなたに 'ヌル'や[他のタイプの注射に落ちるように]注入するので、あなたを偽の安心感に魅了することができます(http://site.mockito.org/mockito/docs/current/org/mockito/InjectMocks .html)は黙っています。テストからコンストラクタを明示的に呼び出す方がはるかに安全ですっきりしています。 –

答えて

1

Mockito documentationを参照してください:

  1. コンストラクタ・インジェクション。最大のコンストラクタが選択された場合、引数はテストで宣言されたモックで解決されます。オブジェクトがコンストラクタで正常に作成された場合、Mockitoは他の戦略を試しません。 Mockitoは、パラメータ化されたコンストラクタがある場合、オブジェクトを破損させないことを決定しました。
    注:引数が見つからない場合、nullが渡されます。非疑似型が必要な場合は、コンストラクタインジェクションは行われません。このような場合、依存関係を自分で満たす必要があります。と、たとえば、あなたが依存関係を自分で満足する必要があります

    public class ArticleManager { 
        private ArticleDatabase database; 
        private ArticleCalculator calculator; 
    
        ArticleManager(ArticleObserver observer, boolean flag) { 
         // observer is not declared in the test above. 
         // flag is not mockable anyway 
        } 
    } 
    

[...]

そして最後に、何の注入は、この場合のタイプに起こりませんJUnitの@Beforeを使用したセットアップ方法。

関連する問題