1

스프링 통합 테스트에 문제가 있습니다.스프링 부트 @SpyBean이 컨텍스트가 재설정되지 않는 문제로 인해 테스트 스위트가 오류를 일으킬 수 있습니다.

동작은 : 나는 고립에서 아래의 테스트를 실행하면

  • , 그것은 성공이다.

  • 그러나 모든 테스트가 실행되면 아래에있는 테스트를 포함하여 많은 테스트가 오류가 발생합니다.

  • 아래의 테스트를 무시하고 모든 테스트를 실행하면 모두 성공합니다.

가 높은 우리의 비즈니스 로직과 관련이 있기 때문에 오류 스택 트레이스를 포함하지 않은 나는 오류가 스프링 부팅 테스트 @SpyBean 내 사용과 관련이있다 생각한다.

@RunWith(SpringRunner.class) 
@ActiveProfiles(profiles = "test") 
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 

... 

@Autowired 
private TestRestTemplate restTemplate; 

@Autowired 
private DataKeyStore dataKeyStore; 

@SpyBean 
private TokenTools tokenTools; 

... 

@Test 
public void myTest() throws Exception { 

    doReturn("someGeneratedToken") 
     .doReturn("someGeneratedToken") 
     .doCallRealMethod() 
     .when(tokenTools) 
     .createToken(any(TokenProfile.class), anyString(), anyString()); 
    ... 

DataKeyStoreTokenTools의 종속성입니다 참고 : 여기에

는 테스트입니다. 제가 위에서 말했듯이

, 나는

내 질문은 내가이 시험은 다른 시험을 밟지 않도록 할 수있는 방법입니다 ... 테스트는 서로 스테핑하고 나의 @SpyBean 어떻게 든 다른 테스트 클래스에 누수 의심 ? 나는

또한 걸 퍼즐은 @SpyBean 이미 (문서/javadoc에 따라) 재설정한다는 것입니다 ... 아무 소용에 @DirtiesContext 주석을 시도했습니다.

아무도 도와 줄 수 있습니까?

편집 : 한 번 테스트의 초기화 및 위의 테스트에 대한 @SpyBean을 만들기위한 두 번째 시간 : 테스트를 디버깅하는 내 IDE를 사용하여이 TokenTools 모든 시험에 두 번 밖에 인스턴스화하고 있음을 나타냅니다. 위 테스트에서 실행 된 나머지 테스트는 두 번째 인스턴스, 즉 @SpyBean 인스턴스를 사용합니다 ...

+0

인스턴스 생성시'@ SpyBean'의 종속성이 변경된 전역 상태로 바뀌어 나중에 테스트 할 때 문제가 발생합니다. 따라서 @DirtiesContext를 사용하여 걱정할 필요가 없습니다. 우리의 응용 프로그램 디자인과 함께 ... – balteo

+0

내 ** 편집 **은 여전히 ​​그렇습니다. – balteo

답변

0

나는 @DirtiesContext도 우리에게 적합하지 않음을 확인했습니다. 우리는 오래된 문맥이 닫힌 후에 새로운 문맥을 위해 (Liquibase를 사용하여) DB를 초기화하는 데 문제가있었습니다 (@DirtiesContext 주석에 의한).

예컨대 : 각각의 이름에 대해 생성 별도의 Spring 컨텍스트가

@RunWith(SpringRunner.class) 
@SpringBootTest 
@ContextConfiguration(classes = SpringBootApp.class, name = "mainContext") 
public class TestThatDoesntFakeBeans(){ 
} 

@RunWith(SpringRunner.class) 
@SpringBootTest 
@ContextConfiguration(classes = SpringBootApp.class, name = "contextWithFakeBean") 
public class TestThatFakeBeans(){ 
    @SpyBean 
    //... 
} 

이 방법을 :

우리는 몇 가지 BENS를 날조하는 테스트 다르게 봄 테스트 명명 컨텍스트 끝났다. 동일한 이름을 가진 컨텍스트가 테스트에 의해 재사용됩니다. 물론 동일한 컨텍스트 이름을 가진 테스트가 서로 영향을 미치지 않도록해야합니다.