programing

스프링 부트 테스트: 모든 테스트에 대해 컨텍스트가 로드됩니까?

lovejava 2023. 6. 28. 21:14

스프링 부트 테스트: 모든 테스트에 대해 컨텍스트가 로드됩니까?

제 프로젝트에는 모든 시험을 위한 슈퍼 클래스가 있습니다.이것은 그 수업의 서명입니다.

@RunWith(SpringRunner.class)
@SpringBootTest(value = {"management.port=0"}, classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles({"localhost", "test"})
@ContextConfiguration(classes = {Application.class, SomeConfiguration.class})
@Ignore
public abstract class AIntegrationTest {

여기서 Application.class는 메인 클래스이고 SomeConfiguration.class는 일부 @Bean과 다른 것들에 대해서만 클래스이며, 화려하지 않습니다.

저는 gradle을 사용하고, 테스트를 실행하기 위해 다음을 수행합니다.

./gradlew :my-project:test

문제는 다음과 같습니다.

  • 각 테스트에 대해 컨텍스트가 초기화되고 있는지 확신할 수 없습니다.하지만 저는 문맥이 여러 번 초기화된다고 확신할 수 있습니다.저는 로그를 보고 이것을 압니다.
  • 여러 개의 콘텍스트가 초기화되기 때문에 콘텍스트가 서로 겹치는 것 같습니다.증상 중 하나가 다음 예외이기 때문에 이를 알고 있습니다.

    Caused by: org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [org.springframework.cloud.context.environment.EnvironmentManager@36408d9e] with key 'environmentManager'; nested exception is javax.management.InstanceAlreadyExistsException: RedeemAway:name=environmentManager,type=EnvironmentManager
    
  • 로드되는 여러 컨텍스트에 대해 신경 쓰지 않더라도 테스트가 완료되면 이전 컨텍스트가 종료되기 전에 다음 테스트에서 새 컨텍스트를 얻을 수 있습니다.위에서 예외가 겹쳐서 한 말입니다.

모든 테스트가 동일한 JVM을 공유하므로 일부 콩이 두 번 등록되면 해당 예외가 발생합니다.다음 링크에서:

컨텍스트 캐싱

다음과 같은 것으로 알려져 있습니다.

응용프로그램 컨텍스트는 로드에 사용되는 구성 매개변수의 조합으로 고유하게 식별할 수 있습니다.따라서 구성 매개 변수의 고유한 조합을 사용하여 컨텍스트가 캐시되는 키를 생성합니다.TestContext 프레임워크는 다음 구성 매개 변수를 사용하여 컨텍스트 캐시 키를 작성합니다.

그건 이해합니다만, 어떻게 하면 그것을 달성할 수 있을까요?제 목표는 동일한 JVM에서 모든 테스트를 실행하고 모든 테스트에서 컨텍스트를 재사용하는 것입니다.

2월 22일 목요일에 편집

제가 시도한 것들:

  • spring.jmx.enabled: false
  • spring.jmx.default-domain: some-value

Spring Cloud의 Environment Manager에 대한 경쟁이 있기 때문에 JMX를 비활성화하는 것은 도움이 되지 않습니다.

저는 제 문제에 대한 답을 찾았습니다.다음은 잘 설명된 내용입니다.

https://github.com/spring-projects/spring-boot/issues/7174

기본적으로 여러 테스트를 실행할 경우, 그 중 하나가 시작되자마자 주석을 사용할 수 있습니다.@MockBean스프링이 컨텍스트를 다시 로드하도록 강제합니다.

보너스: 테스트에서 다음을 사용하는 경우에도 동일한 동작을 볼 수 있습니다.org.mockito.Mock.

언급URL : https://stackoverflow.com/questions/48929585/spring-boot-test-context-loaded-for-every-test