我如何知道是否正在使用Mock in Spring启动?

时间:2017-03-16 07:31:00

标签: java unit-testing spring-boot mockito spring-boot-test

我正在测试一个在其下使用Dao层的服务类。

@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。

我如何知道mock实际上正在工作?appService从内部调用appDao方法实际上是模拟。是否有任何编程方式来验证这一点。

P.S。如果@Mock在这种情况下有效,那么@MockBean对于春季启动非常有用。

1 个答案:

答案 0 :(得分: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