2017-05-17 13 views
3

動的に生成されるいくつかのリソースを模擬しようとしています。これらのリソースを生成するには、クラス引数を渡す必要があります。したがって、たとえば:Mockito特定のクラス引数

FirstResourceClass firstResource = ResourceFactory.create(FirstResourceClass.class); 

SecondResourceClass secondResource = ResourceFactory.create(SecondResource.class); 

これは私がモックしようとするまではうまくいいです。それはモックのように思える

PowerMockito.mockStatic(ResourceFactory.class); 
FirstResourceClass mockFirstResource = Mockito.mock(FirstResourceClass.class); 
SecondResourceClass mockSecondResource = Mockito.mock(SecondResourceClass.class); 

PowerMockito.when(ResourceFactory.create(Matchers.<Class<FirstResourceClass>>any()).thenReturn(mockFirstResource); 
PowerMockito.when(ResourceFactory.create(Matchers.<Class<SecondResourceClass>>any()).thenReturn(mockSecondResource); 

は、呼び出し元のクラスに注入されているが、FirstResourceClassはコンパイルエラーをスローmockSecondResourceを、送信されている:私はこのような何かをしています。

問題は、私がthis questionから得たany()を使用して(私は)思っています。私はisA()を使用しなければならないと信じていますが、それはClass引数を必要とするので、そのメソッド呼び出しをどのように行うかはわかりません。私はFirstResourceClass.classを試しました、そして、それはコンパイルエラーを与えます。

+0

'any()'はいずれの場合も何でも一致しますので、これはうまくいかないでしょう。私はここで 'eq()'を試してみます: 'Matchers.eq(FirstResourceClass.class)'。この方法では、引数が指定されたクラスと等しい場合にマッチャがマッチします。これはおそらくあなたが望むものです。 –

答えて

5

のようにあなたは、eqをしたい:

PowerMockito.when(ResourceFactory.create(Matchers.eq(FirstResourceClass.class))) 
    .thenReturn(mockFirstResource); 

any()引数を無視し、isAがあなたの引数が一定であることをクラスではなく、それはそれがあるだけであること、クラスに等しいことを確認します特定のクラスのinstanceofです。そうeqそれは、

isA(Class.class)はあなたの呼び出しを区別する必要があるほど固有である(any(Class)はMockitoの1.xでany()セマンティクスおよび2.xではisA意味を持っています)。とにかく、クラスオブジェクトには明確な等価性がありますので、これは簡単で自然な使い方です。

あなたはマッチャーを使用しない場合eqは、デフォルトでこれも動作するので:Mockitoの新しいバージョンがArgumentMatchersの賛成でマッチャー名を非推奨している、とMockito.eqも機能することを

PowerMockito.when(ResourceFactory.create(FirstResourceClass.class)) 
    .thenReturn(mockFirstResource); 

は注意(いえ彼らは "継承されている"ので、不器用です。staticメソッド)。

+0

ありがとう! Matchers.eq()は私が探していたものです。 – Ajayc

関連する問題