2016-10-25 7 views
9

(spring-boot1.4.0)으로 여러 개의 스프링 부팅 테스트 클래스를 만들었습니다.스프링 부트 테스트 - 여러 테스트가 단일 컨텍스트를 공유 할 수 있습니까?

FirstActionTest.java :

@RunWith(SpringRunner.class) 
@WebMvcTest(FirstAction.class) 
@TestPropertySource("classpath:test-application.properties") 
public class FirstActionTest { 
    @Autowired 
    private MockMvc mvc; 

    // ... 
} 

SecondActionTest.java :

를 통해 테스트를 실행
@RunWith(SpringRunner.class) 
@WebMvcTest(SecondAction.class) 
@TestPropertySource("classpath:test-application.properties") 
public class SecondActionTest { 
    @Autowired 
    private MockMvc mvc; 

    // ... 
} 

:

MVN 테스트

각 테스트 클래스마다 스프링 테스트 컨텍스트가 작성된 것 같습니다. 필요하지 않습니다.

질문 :

  • 는 여러 테스트 클래스 중 하나의 스프링 테스트 컨텍스트를 공유하는 것이 가능하고, 만약 그렇다면, 어떻게?
+0

예 가능합니다. http://stackoverflow.com/a/8502023/410677 – kuhajeyan

+0

@kuhajeyan 링크는 xml 기반 구성을위한 것이며, spring2.5에서도 매우 쉽게 할 수 있습니다. 하지만 스프링 부트에서는 일반적으로 컨텍스트에 대한 구성 파일이 없으며 스프링 부트에이를 적용하는 방법이 확실하지 않습니다. –

+0

@ EricWang도 같은 것을 찾고 있습니까? 당신이 그것에 대한 답을 찾을 수 있었습니까? – Ahmed

답변

5

@WebMvcTest (즉 @WebMvcTest(FirstAction.class)@WebMvcTest(SecondAction.class))와 두 개의 서로 다른 클래스를 사용하여 당신은 특히 서로 다른 애플리케이션 컨텍스트를 원하는 표시된다. 이 경우 각 컨텍스트마다 다른 bean 세트가 들어 있기 때문에 단일 컨텍스트를 공유 할 수 없습니다. 만약 당신이 컨트롤러 빈 (bean)이라면, 컨텍스트가 상대적으로 빠르게 생성되어야하고, 실제로 문제가 없어야합니다.

모든 웹 테스트에서 캐시되고 공유 할 수있는 컨텍스트를 갖고 싶다면 정확하게 동일한 bean 정의가 포함되어 있는지 확인해야합니다. 마음에 드는 두 가지 옵션 :

1) 컨트롤러를 지정하지 않고 @WebMvcTest을 사용하십시오.

FirstActionTest :

@RunWith(SpringRunner.class) 
@WebMvcTest 
@TestPropertySource("classpath:test-application.properties") 
public class FirstActionTest { 
    @Autowired 
    private MockMvc mvc; 

    // ... 
} 

SecondActionTest :

@RunWith(SpringRunner.class) 
@WebMvcTest 
@TestPropertySource("classpath:test-application.properties") 
public class SecondActionTest { 
    @Autowired 
    private MockMvc mvc; 

    // ... 
} 

2) 모든 @WebMvcTest를 사용하지 마십시오 그래서 당신은 모든 콩 (뿐만 아니라 웹 문제를 포함하는 애플리케이션 컨텍스트를 얻을 수)

처음 ActionTest :

@RunWith(SpringRunner.class) 
@SpringBootTest 
@TestPropertySource("classpath:test-application.properties") 
public class FirstActionTest { 
    @Autowired 
    private MockMvc mvc; // use MockMvcBuilders.webAppContextSetup to create mvc 

    // ... 
} 

SecondActionTest : 당신이 반복적으로 개발 한 번에 하나의 테스트를 실행하는 경우 캐시 된 상황이 빠르게 여러 테스트를 실행 할 수 있다는 것을 명심하지만

@RunWith(SpringRunner.class) 
@SpringBootTest 
@TestPropertySource("classpath:test-application.properties") 
public class SecondActionTest { 
    @Autowired 
    private MockMvc mvc; // use MockMvcBuilders.webAppContextSetup to create mvc 

    // ... 
} 

, 당신 콩을 많이 만드는 비용을 지불하고 즉각 버려집니다.

+1

자동 와이어 링의 경우 MockMvc'@ SpringBootTest'를 수행 할 때 주석을 추가 할 수도 있습니다. – Ahmed

+0

명확한 설명을 주셔서 감사합니다.'옵션 1) '은 여러 개의 mvc 테스트가있는 프로젝트에서 좋습니다. 이 정보가 스프링 부트 문서에 포함될 수 있다면 도움이 될 것입니다. –

+0

테스트에 지정된 컨트롤러 클래스없이'@WebMvcTest'를 직접 사용하고'mvn test'를 시작하면 autowired 의존성을 찾지 못하고 다음과 같은 오류가 발생합니다 :'Caused by : org.springframework.beans.factory. UnsatisfiedDependencyException : 'sportsFieldAction'이라는 이름의 빈을 생성하는 중 오류가 발생했습니다 : 'dao'필드를 통해 표현 된 충족되지 않은 종속성 : 종속성 [com.sportslight.dao.SportsFieldDao]'에 대해 [com.sportslight.dao.SportsFieldDao] 유형의 적격 빈이 발견되지 않았습니다. 문맥이 콩을 찾지 못했는데 왜 그런지 모르겠다. –