В тесте 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");
}
}
}