Я тестирую класс обслуживания, в котором используется слой 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 мс.
Откуда я знаю, что макет действительно работает, и когда appService
вызывает метод appDao
изнутри, это на самом деле макет. Есть ли программный способ проверить это.
P.S. Если @Mock
работает в этом сценарии, то @MockBean
полезно для весенней загрузки.
@InjectMocks
иMockitoAnnotations.initMocks(this);
из теста. При использовании@MockBean
Spring Boot позаботится обо всем этом за вас... Вы в основном боретесь с этим с вашей текущей настройкой. - person M. Deinum   schedule 16.03.2017MockitoAnnotations.initMocks(this);
в сценарии. - person Tarun Maganti   schedule 16.03.2017Mockito.mock
и действительно спросите себя, следует ли делать то, что вы делаете. Вам действительно нужен этот тест, чтобы быть интеграционным тестом Spring, если вы издеваетесь над фильтром? Разве это не должен быть простой модульный тест. - person M. Deinum   schedule 16.03.2017