Как узнать, используется ли загрузка Mock in Spring или нет?

Я тестирую класс обслуживания, в котором используется слой 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 полезно для весенней загрузки.


person Tarun Maganti    schedule 16.03.2017    source источник
comment
Проблема в вашем коде. Удалите @InjectMocks и MockitoAnnotations.initMocks(this); из теста. При использовании @MockBean Spring Boot позаботится обо всем этом за вас... Вы в основном боретесь с этим с вашей текущей настройкой.   -  person M. Deinum    schedule 16.03.2017
comment
@M.Deinum M.Deinum Это сработало для меня. Спасибо. Но что, если я использую MockBean и Mock, как мне использовать MockitoAnnotations.initMocks(this); в сценарии.   -  person Tarun Maganti    schedule 16.03.2017
comment
Вы не должны использовать любой из них, но не смешивайте, так как это приведет к проблемам. Кроме того, если вы собираетесь самостоятельно заменять переменные в экземплярах компонента, вам также придется обновить контекст приложения после теста.   -  person M. Deinum    schedule 16.03.2017
comment
Что, если я не хочу издеваться над фасолью. Вот вопрос, который описывает ситуацию. [Mock and MockBean] (stackoverflow.com/questions/42833049/)   -  person Tarun Maganti    schedule 16.03.2017
comment
@ M.Deinum Какое решение вышеупомянутой проблемы?   -  person Tarun Maganti    schedule 16.03.2017
comment
Не используйте аннотации... Просто используйте Mockito.mock и действительно спросите себя, следует ли делать то, что вы делаете. Вам действительно нужен этот тест, чтобы быть интеграционным тестом Spring, если вы издеваетесь над фильтром? Разве это не должен быть простой модульный тест.   -  person M. Deinum    schedule 16.03.2017
comment
Давайте продолжим обсуждение в чате.   -  person Tarun Maganti    schedule 16.03.2017


Ответы (1)


M.Deinum указывает вам правильное направление в комментарии.

Возможно, вы хотите прочитать документацию Spring о Mocking и Spying в тестах — 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)

person Mathias Dpunkt    schedule 16.03.2017