#spring #mockito #spring-test
Вопрос:
У меня такая ситуация:
Мой лучший:
@MockBean
MyService myService;
@SpyBean
AnotherService anotherService;
@Test
public void testSomething() {
when(myService).doLoad().thenReturn(xyz); // myService behavior mocked here
}
Еще одна услуга:
@PostConstruct
public void init() {
this.xyz = myService.doLoad();
this.process(xyz);
}
Я хочу сохранить @PostConstruct
это здесь, так как я хочу, чтобы боб быстро вышел из строя в среде prod, если load
и process
выйдет из строя. Однако при тестировании у меня возникла ситуация, так как, когда создается шпион, он звонит PostConstruct
до myService.doLoad
того, как вызов будет высмеян (что не происходит до фактического теста). Это приводит к преждевременному провалу теста.
Есть какие-нибудь идеи о том, как лучше всего с этим справиться? Что я могу придумать, так это создать SpyBean
динамически после макета в самом тесте, а не на уровне класса. Таким образом PostConstruct
, программа будет выполняться после того, как зависимость будет высмеяна, но открыта и для других идей. Мне было интересно, есть ли какой-либо способ сделать это в самой аннотации, что-то вроде использования пользовательской конструкции post на MockBean
?
Кроме того, я не могу издеваться над init
методом SpyBean
, поскольку он сталкивается с той же проблемой, компонент создается до того, как определены насмешки, поэтому это бессмысленно.
Я думал об изменении SpyBean
на a MockBean
, а затем использовать callRealMethod
во всех вызовах, за исключением init
, проблема в том, что некоторые методы являются частными и их нельзя высмеивать.