2017-02-06 5 views
1

잘 작동하는 스프링 부팅 응용 프로그램이 있지만 통합 테스트를 시작할 때 프로젝트에 순환 종속성이 있음을 발견했습니다.표준 응용 프로그램 시작시 표시되지 않는 통합 테스트에서 예외를 제거합니다.

@Service 
public class CrowdManagerSyncService { 
    private final CrowdManagerSyncScheduler crowdManagerSyncScheduler; 

    @Autowired 
    public CrowdManagerSyncService(CrowdManagerSyncScheduler crowdManagerSyncScheduler) { 
     this.crowdManagerSyncScheduler = Objects.requireNonNull(crowdManagerSyncScheduler); 
    } 
} 

그리고

@Component 
public class CrowdManagerSyncScheduler { 
    @Autowired 
    private CrowdManagerSyncService crowdManagerSyncService; 
} 

그것은 내 코드가 아닙니다 나는 지금 그것을 다시 할 준비가 아닙니다. 그러나 생산 과정에서 완벽하게 작동합니다. 확인할 수없는 순환 참조가 있습니까 : 창조 현재 콩 요청 :

오류 'crowdManagerSyncService'이름을 가진 bean 작성 :

@RunWith(SpringRunner.class) 
@WebMvcTest(UserController.class) 
@WithMockUser(roles={"ADMIN"}) 
@ContextConfiguration(classes = {AdminConsoleApplication.class, DataSourceAutoConfiguration.class, 
     MockMvcAutoConfiguration.class, MockMvcWebDriverAutoConfiguration.class}) 
public class UserControllerTest { 
    @Autowired 
    private MockMvcHtmlUnitDriverBuilder builder; 
    private WebDriver webDriver; 

    @Before 
    public void setUp() throws Exception { 
     webDriver = builder.build(); 
    } 
} 

내 통합 테스트에서 나는 예외를 잡아?

그럼, 내 질문은 : 어떻게 그 끔찍한 순환 종속성을 제거하지 않고 테스트 에이 문제를 생략합니다? 프로덕션 환경에서 잘 작동하므로 코드를 변경하지 않고 테스트 컨텍스트를 시작할 수있는 방법이 있습니다.

+0

스택 추적을 첨부 할 수 있습니까? 봄 부팅 버전 ... – Babl

+0

@Babl 여기 내 스택 추적 : http://pastebin.com/VYXh0vgh – Solorad

답변

1

@WebMvcTest은 "적절한"통합 테스트에 적합하지 않습니다. the api docs에서

: 테스트가 스프링 MVC 구성 요소에 초점을 맞추고 때

을 사용할 수 있습니다.

그러나 @ContextConfiguration을 사용하면 기본적으로 전체 애플리케이션을 테스트에 추가 할 수 있습니다.

@ContextConfiguration을 제거하고 대신 @MockBeanCrowdManagerSyncService을 테스트에 사용하십시오. CrowdManagerSyncService 모의 버전을 만들어 테스트 응용 프로그램 컨텍스트의 UserController에 삽입합니다. 그냥 UserController을 테스트하려고 어디서나 CrowdManagerSyncService "진짜"의 어떤 인스턴스가 없기 때문에 원형 의존성 문제를 전적으로 회피하는 경우

@RunWith(SpringRunner.class) 
@WebMvcTest(UserController.class) 
@WithMockUser(roles={"ADMIN"}) 
public class UserControllerTest { 
    @Autowired 
    private MockMvcHtmlUnitDriverBuilder builder; 

    @MockBean 
    private CrowdManagerSyncService service; 

    private WebDriver webDriver; 

    @Before 
    public void setUp() throws Exception { 
     webDriver = builder.build(); 
    } 

    @Test 
    public void shouldWork() { 
     when(service.doStuff()) 
      .thenReturn("Hello"); // regular Mockito mocking 
    } 
} 

이 적합하다. 또한 (MockMvc과 실제 HTTP 물건을 대체) 모두 (단지 생산과 같은 응용 프로그램을 부트 스트랩) @SpringBootTest@AutoConfigureMockMvc@WebMvcTest@ContextConfiguration을 대체 할 수

.

+0

감사합니다! '@SpringBootTest (classes = AdminConsoleApplication.class)'와'@ AutoConfigureMockMvc'가 정말 도움이되었습니다! – Solorad