、私は次のクラスのユニットテストを書いています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メソッドをモックする必要があります。
フォーマットにお詫び申し上げます。私はいくつかの奇妙な理由で質問を提出することができませんでした。したがって、醜いフォーマット。 – yaswanth
私はSpringベースのテストで何かを模倣する理由が分かりません(http層でMockMVCを使用している場合を除く)。 '@RunWith(SpringJUnit4ClassRunner.class)'を使うと、すべてのSpring Beanをロードすることができます。それらは一緒に配線され、テストで定義されたものを返すスタブではなく、実際のコードをテストします。依存するBean内部のコード。モッキングは右手で使うとすばらしいツールですが、私はSpringベースのテストでこれを使ったことはありません。他の人がそれをやったのを見たときは、いつも混乱しています。 –
@KlausGroenbaekは正しいと思います。 Spring ApplicationContextをモックしようとするのではなく、それを使用してください。テストに必要な適切なbean/mockを返すテストアプリケーションコンテキストを作成します。 –