web-dev-qa-db-ja.com

@Mockおよび@InjectMocksの複数のレベル

したがって、Mockitoでは@InjectMocksは@Mockのアノテーションを使用して何でも注入できることを理解していますが、このシナリオの処理方法は?

@Mock
private MockObject1 mockObject1;

@Mock
private MockObject2 mockObject2;

@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();

MockObject2にタイプMockObject1の属性があり、SystemUnderTestにタイプMockObject2の属性があるとします。 mockObject2にmockObject1を注入し、systemUnderTestにmockObject2を注入します。

これは注釈で可能ですか?

37
Collin Peters

ここで何の返答も得られなかったので、Mockitoフォーラムで質問しました。これはディスカッションへのリンクです: https://groups.google.com/d/topic/mockito/hWwcI5UHFi0/discussion

答えを要約すると、技術的にこれは一種のあざける目的を無効にするでしょう。実際には、SystemUnderTestクラスが必要とするオブジェクトのみを模擬する必要があります。それ自体がモックであるオブジェクト内の物事をモックすることは、一種の無意味です。

本当にやりたいのなら、@ spyがお手伝いします

29
Collin Peters

@Spyを@InjectMocksと組み合わせることで可能になります。あなたの例では、それは:

@Spy
private MockObject1 mockObject1 = new MockObject1 ();

@Spy @InjectMocks //if MockObject2 has a MockObject1, then it will be injected here.
private MockObject2 mockObject2 = new MockObject2 ();

@InjectMocks
private SystemUnderTest systemUnderTest;
20
MattC

私が見つけた他の解決策は、アノテーションの代わりにJava構文を使用して@Spyオブジェクトを挿入することです。

@Spy
private MockObject1 mockObject1 = new MockObject1 ();

@InjectMocks //if MockObject2 has a MockObject1, then it will be injected here.
private MockObject2 mockObject2 = spy(MockObject2.class);

@InjectMocks
private SystemUnderTest systemUnderTest;
7
z1lV3r

これは私にとってはうまくいきます:

private MockObject1 mockObject1 = mock(MockObject1.class);

@Spy
private RealObject2 realObject = new RealObject2(mockObject1);

@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();
2
Zane