Код: Выделить всё
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