Как я могу загнать метод до Spring ApplicationReadeVent?JAVA

Программисты JAVA общаются здесь
Anonymous
Как я могу загнать метод до Spring ApplicationReadeVent?

Сообщение Anonymous »

У меня есть следующие компоненты в коде моего приложения. При запуске приложений я хочу позвонить в некоторые методы инициирования. Однако во время тестирования я хочу ничего не делать, когда эти методы вызываются. < /P>

Код: Выделить всё

    import lombok.extern.slf4j.Slf4j;
   import org.springframework.beans.factory.annotation.Autowired;
   import org.springframework.boot.context.event.ApplicationReadyEvent;
   import org.springframework.context.event.EventListener;
   import org.springframework.stereotype.Service;
  
   @Slf4j
   @Service
   public class ManagementService {
       @Autowired
       private Temp temp;
  
       @EventListener(ApplicationReadyEvent.class)
       public void startup() {
           log.info("Startup on application ready.");
           temp.print();
       }
   }
  
   @Slf4j
   @Component
   public class Temp {
       public void print() {
           log.info("Inside temp");
       }
   }
< /code>
Я использовал @beforeeach, чтобы заглушить методы, такие как: < /p>
    @SpringBootTest
   public abstract class SpringIntegrationBaseTest {
       @SpyBean
       protected ManagementService service;
       @SpyBean
       protected Temp temp;
     
  
       @BeforeEach
       public void preventConnection() throws SQLException {
           Mockito.doNothing().when(temp).print();
       }
   }
< /code>
Однако я заметил, что журналы из первого модульного теста показывают: < /p>
    2024-10-23 10:24:16.675  INFO 23628 [           main] o.a.c.l.i.Jdk14Logger                    : Started ManagementServiceTests in 3.382 seconds (process running for 4.907)
   2024-10-23 10:24:16.694  INFO 23628 [           main] c.c.s.ManagementService                  : Startup on application ready.
   2024-10-23 10:24:16.696  INFO 23628 [           main] c.c.s.Temp                               : Inside temp
< /code>
и на втором контрольном тесте он правильно ничего не делает для print (). < /p>
    2024-10-23 10:36:36.799  INFO 17496 [           main] o.a.c.l.i.Jdk14Logger                    : Started RestControllerTest in 0.821 seconds (process running for 5.924)
   2024-10-23 10:36:36.801  INFO 17496 [           main] c.c.s.ManagementService                  : Startup on application ready.
< /code>
При дальнейшей проверке я заметил, что загрязнение выполняется только непосредственно перед тестированием, и когда контекст приложения инициализируется, метод print () все еще вызывается, потому что загрязнение еще не выполняется, но в следующем тесте предыдущий загрязняющий > Контекст приложения инициализируется -> Слушатель событий вызвал-> ofeece stubbing-> test < /p>
< /blockquote>
Я хотел бы что-то подобное: < /p>

< Blockquote>
??? -> Загрязнить-> ??? -> Слушатель событий позвонил-> ??? -> Тест < /p>
< /blockquote>
Где ??? Является ли любой промежуточный шаг < /p>
Я обнаружил, что могу использовать @mockbean, чтобы просто высмеивать температуру и ничего не делать для всех методов по умолчанию, однако во время тестирования мне нужно использовать фактическое поведение некоторых методов Вот почему я хотел бы использовать @spybean, чтобы не приходилось загрязнять все методы, используемые при тестировании. Springintegrationbasetest, как и So: < /p>
@PostConstruct
public void init() throws Exception {
log.info("postconstruct init");
Mockito.doNothing().when(temp).print();
}
Тем не менее, это также выполняет после Аннотированный метод слушателя событий.

Подробнее здесь: https://stackoverflow.com/questions/791 ... readyevent

Вернуться в «JAVA»