2017-04-20 7 views
1

、私は次のクラスのユニットテストを書いていますTestNGで単体テストを書くためにMockitoを使ってSpring ApplicationContextのgetBeanメソッドを模倣するにはどうしたらいいですか?

クラステストする:以下

public class RandomManager { 
     @Autowired 
     private ApplicationContext context; 

     @Autowired 
     private ClassA objectA; 

     public void methodToBeTested() { 
      objectA.methodToBeVerified(context.getBean(Random.class,"Yaswanth","Yaswanth")); 
     } 
    } 

テストクラスである:

public class RandomManagerTest { 

    @Mock 
    private ClassA objectA; 

    @Mock 
    private ApplicationContext context; 

    @InjectMocks 
    private RandomManager randomManager; 

    @BeforeTest 
    public void before() { 
     MockitoAnnotations.initMocks(this); 
     doReturn(any(Random.class)).when(context) 
      .getBean(any(Class.class), any(), any()); 
    } 

    @Test 
    public void methodToBeTestedTest() { 
     Random randomObject = new RandomObject("Yaswanth", "Yaswanth"); 
     randomManager.methodToBeTested(); 
     verify(objectA).methodToBeVerified(randomObject); 
    } 
} 

とき、私上記のコードは、メソッドの前に失敗しましたapplicationContextモック をスタブしようとしています。次のエラーが表示されます。

検証またはスタブ以外の引数マッチャーは使用できません。引数照合プログラムの正しい使用の 例: (mock.get(anyInt()))thenReturn(NULL)。 doThrow(新しいRuntimeException())。(モック).someVoidMethod(anyObject()); スタブ方法 (最後 マッチャは任意ようなオブジェクトを返すされている場合、このメッセージは、NullPointerExceptionが発生した後に表示されること

(モック).someMethod((「FOO」を含む))を確認)が、署名は、プリミティブの引数を期待しますこの場合は、代替のプリミティブ を使用してください。 when(mock.get(any())); //悪い使い方は、NPEを発生させます (mock.get(anyInt())); //使用法を正しく修正する

また、模擬できない メソッドで引数マッチャーを使用するため、このエラーが表示されることがあります。最終/プライベート/等しい()/のhashCode():次の方法は スタブ/検証をすることはできません。モーフィング方法 は非公開の親クラスで宣言されていません。

上記のコード で何が間違っているのか理解してもらえますか?

注:私はTestNGのとMockitoを使用しています。私は AbstractTestNGSpringContextTestsを拡張し、私の 豆を宣言し、spring-test.xmlを使用してのApplicationContextをautowireすることができます。それは私の使用例である の過剰な感じです。私は、単にapplicationContextのgetBeanメソッドをモックする必要があります。

+0

フォーマットにお詫び申し上げます。私はいくつかの奇妙な理由で質問を提出することができませんでした。したがって、醜いフォーマット。 – yaswanth

+0

私はSpringベースのテストで何かを模倣する理由が分かりません(http層でMockMVCを使用している場合を除く)。 '@RunWith(SpringJUnit4ClassRunner.class)'を使うと、すべてのSpring Beanをロードすることができます。それらは一緒に配線され、テストで定義されたものを返すスタブではなく、実際のコードをテストします。依存するBean内部のコード。モッキングは右手で使うとすばらしいツールですが、私はSpringベースのテストでこれを使ったことはありません。他の人がそれをやったのを見たときは、いつも混乱しています。 –

+0

@KlausGroenbaekは正しいと思います。 Spring ApplicationContextをモックしようとするのではなく、それを使用してください。テストに必要な適切なbean/mockを返すテストアプリケーションコンテキストを作成します。 –

答えて

1

問題は、あなたがany()を使用することはできませんdoReturn(any(Random.class))から来ています。 実際のインスタンスで置き換えてください。

+0

ありがとう@juherr。出来た。しかしdoReturn()でany()を使用しないのはなぜですか? – yaswanth

+0

返されるparamではなく、paramの一致のための* idがあると思います。実際には、エラーメッセージに解決策がありました。しかし、おそらくあなたが望むものが可能になる可能性があります(良いSOの質問) – juherr