2017-03-16 3 views
0

私はそれの下に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は春の起動時に役立ちます。

+2

問題は、あなたのコードです。あなたのテストから '@ InjectMocks'と' MockitoAnnotations.initMocks(this); 'を削除してください。 '@ MockBean'を使うときは、あなたのためにSpring Bootが全てを処理します...あなたは基本的にあなたの現在の設定でそれと戦っています。 –

+0

@ M.Deinumそれは私のために働いています。ありがとう。しかし、MockBeanとMockの両方を使用する場合、シナリオでどのように 'MockitoAnnotations.initMocks(this); 'を使うべきでしょうか。 –

+0

あなたはどちらかを使うべきではありませんが、ミックスしないことで問題につながります。また、Beanインスタンスの変数を自分で置き換える場合は、テスト後にアプリケーションコンテキストを更新する必要があります。 –

答えて

2

M.Deinumがコメントの正しい方向を指しています。

たぶんあなたがモッキングとスパイについて春のドキュメントを与えたいと思うが、読み取りテスト - https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-mocking-beans

をしかし、あなたが質問に答えるために - あなたは、オブジェクトがモックであれば教えてMockingDetailsを使用することができます。

MockingDetails mockingDetails = org.mockito.Mockito.mockingDetails(appDao) 

boolean appDaoIsMock = mockingDetails.isMock() 

https://stackoverflow.com/a/15138628/5371736

関連する問題