我怎么知道 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()
()
我正在测试一个服务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()
()