Отсрочка постконструкции с помощью SpyBean

#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 , проблема в том, что некоторые методы являются частными и их нельзя высмеивать.