私はそれの下にDao層を使用するサービスクラスをテストしています。上記のプログラムでMock in Springブートが使用されているかどうかはどのようにわかりますか?
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class AppServiceTest {
@Autowired
@InjectMocks
private AppService appService;
private AppConfig appConfig = new AppConfig(), appConfigOut = new AppConfig();
@MockBean //This statement is under inspection in the problem
private AppDao appDao;
@Before
public void setUp() throws Exception {
String appKey = "jsadf87bdfys78fsd6f0s7f8as6sd";
appConfig.setAppKey(appKey);
appConfigOut.setAppKey(appKey);
appConfigOut.setRequestPerMinute(null);
appConfigOut.setRequestDate(DateTime.now());
MockitoAnnotations.initMocks(this);
}
@Test
public void testFetchAppConfigValidParam() throws Exception {
when(appDao.fetchAppConfig(appConfig)).thenReturn(appConfigOut);
assertThat(appService.fetchAppConfig(appConfig)).isEqualToComparingFieldByField(appConfigOut);
}
私は@MockBean
を書くとき、テストは、NullPointerExceptionがスローされますが、私は@Mock
を書くときのテストが正常に実行されます。私は、呼び出されているappDaoがappService
で定義された実際のものであり、データベースにアクセスしていると思います。これは、テストに要した時間が約200msであり、他のアプリケーションの通常のテストケースが60ms〜100msであるためです。しかし、DAOが実際にデータにアクセスする他のケースでは、400ms〜500msかかるため、わかりません。
モックが実際に動作していることと、がappDao
メソッドを内部から呼び出すと、それは実際にモックであることがわかります。これを確認するプログラム的な方法はありますか?
P.S.このシナリオで@Mock
が動作する場合、@MockBean
は春の起動時に役立ちます。
問題は、あなたのコードです。あなたのテストから '@ InjectMocks'と' MockitoAnnotations.initMocks(this); 'を削除してください。 '@ MockBean'を使うときは、あなたのためにSpring Bootが全てを処理します...あなたは基本的にあなたの現在の設定でそれと戦っています。 –
@ M.Deinumそれは私のために働いています。ありがとう。しかし、MockBeanとMockの両方を使用する場合、シナリオでどのように 'MockitoAnnotations.initMocks(this); 'を使うべきでしょうか。 –
あなたはどちらかを使うべきではありませんが、ミックスしないことで問題につながります。また、Beanインスタンスの変数を自分で置き換える場合は、テスト後にアプリケーションコンテキストを更新する必要があります。 –