Как я могу заглушить метод перед Spring ApplicationReadyEvent?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как я могу заглушить метод перед Spring ApplicationReadyEvent?

Сообщение Anonymous »

В коде моего приложения есть следующие компоненты. При запуске приложения я хочу вызвать некоторые методы инициализации. Однако во время тестирования я не хочу ничего делать при вызове этих методов.

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

    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");
       }
   }
Я использовал @BeforeEach для блокировки методов следующим образом:

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

    @SpringBootTest
   public abstract class SpringIntegrationBaseTest {
       @SpyBean
       protected ManagementService service;
       @SpyBean
       protected Temp temp;
     
  
       @BeforeEach
       public void preventConnection() throws SQLException {
           Mockito.doNothing().when(temp).print();
       }
   }
Однако я заметил, что журналы первого модульного теста показывают:

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

    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
и во втором модульном тесте он ничего не делает для print().

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

    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.
При дальнейшей проверке я заметил, что заглушка выполняется только непосредственно перед тестом, а при инициализации контекста приложения метод print() все еще вызывается, поскольку заглушка еще не выполнена, но при следующем тесте предыдущая заглушка сохраняется.
Я думаю, это будет выглядеть примерно так:

инициализация контекста приложения --> вызов прослушивателя событий --> заглушка BeforeEach --> тест

Мне хотелось бы что-то вроде этого:
??? --> заглушка --> ??? --> Вызов прослушивателя событий --> ??? --> Тест

где ??? это любой промежуточный шаг
Я обнаружил, что могу использовать @MockBean, чтобы просто издеваться над Temp и ничего не делать для всех методов по умолчанию, однако во время тестирования мне нужно использовать фактическое поведение некоторых методов именно поэтому я хотел бы использовать @SpyBean, чтобы не заглушать все методы, используемые при тестировании.

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

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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