我怎么知道 Spring boot 中的 Mock 是否被使用?

How do I know if Mock in Spring boot is being used or not?

我正在测试一个服务class,它在其下使用了一个 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 中定义并访问数据库的实际应用程序。这是因为测试花费的时间约为 200 毫秒,而其他应用程序的通常测试用例为 60 毫秒至 100 毫秒。但我不确定,因为 DAO 真正访问数据的其他情况需要 400 毫秒到 500 毫秒。

我怎么知道 mock 确实在工作,当 appService 从内部调用 appDao 方法时,它实际上就是 mock。有没有任何程序化的方法来验证这一点。

P.S。如果 @Mock 在这种情况下有效,那么 @MockBean 在 spring 引导中有用。

M.Deinum 在评论中为您指明了正确的方向。

也许您想读一读关于测试中的 Mocking 和 Spying 的 spring 文档 - 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()

()