Mockito mock не работает должным образом в тесте Spring Mock Mvc - PullRequest
0 голосов
/ 08 января 2020

В тесте Spring mock mvc я хочу заменить bean на фиктивную реализацию, сконфигурированную с использованием определений Mockito.when(). Определения действительно соблюдаются во время настройки макета, а также во время введения макета в зависимый компонент (совет контроллера в моем случае) во время запуска контекста приложения. Однако, когда макет используется во время определенного теста, все определения when пропадают.

Почему?

Некоторые замечания:

  • Макет полностью новый код, поэтому невозможно, чтобы я не знал о каком-либо вызове Mockito.reset().
  • , макет во время использования такой же, как и во время создания.
  • a Обойти решение этой проблемы - настроить макет в методе @BeforeEach в AbstractTest. Тем не менее, я хочу понять, почему это не работает без.

Вот упрощенный и анонимный пример

@Component
public class MyBean {
    private String property;

    ...

    public String getProperty() {
        return property;
    }
}

@ControllerAdvice
public class MyControllerAdvice() {

    private MyBean myBean;

    @Autowired
    public MyControllerAdvice(MyBean myBean) {
        this.myBean = myBean;
        System.out.println(this.myBean.getProperty()); // --> outputs "FOOBAR"
    }

    @ModelAttribute
    public String getMyBeanProperty() {
        return myBean.getProperty(); // --> returns null
    }
}


public class AbstractTest {

    @Configuration
    static class Config {

        @Bean
        public MyBean () {

            MyBean myBean = Mockito.mock(MyBean.class, "I am a mock of MyBean");
            when(myBean.getProperty()).thenReturn("FOOBAR");

        }
    }

}

1 Ответ

0 голосов
/ 08 января 2020

Это не проблема Мокито. Я думаю, что вы сильно упростили пример, и мы не видим полную картину, но я могу сказать, что основная причина - 2 разных компонента MyBean: один инициализируется с помощью Spring @Component, второй находится в классе конфигурации с @Bean.

  1. Почему вы используете @Component для POJO / DO?

  2. @Bean в классе конфигурации инициализируется ленивым, так что лучший способ использовать @PostConstruct

  3. Если вы хотите оставить оба боба отмеченными MyBean в классе конфигурации как @Primary

...