2011-08-08 19 views
3

데이터베이스가 다운 된 경우에도 DB 독립적 인 웹 계층 컨트롤러를 단위 테스트하고 싶습니다.단위 테스트 중 dataSource 조롱

그러나 transactionManager bean 인스턴스화는 지정된 DB 자격 증명을 사용하여 dataSource 빈으로 연결할 수 없기 때문에 실패합니다.

또한 저는 제거하고 싶지 않은 @Transactional, @AfterTransaction@BeforeTransaction 주석을 사용했습니다.

데이터베이스 자격 증명을 제공 할 필요가 없지만 여전히 transactionManager 빈을 인스턴스화하는 더미 (또는 모의) dataSource을 정의하는 방법이 있습니까?

+0

대신 derby로 통합 테스트를 만들 수 있습니까? –

+0

참조이 [모의 거래의 코드 예제] [1] [1] : http://stackoverflow.com/questions/11783283/how-do-i-mock-a-transactionmanager-in- a-junit-test-outside-of-the-container – user1313150

답변

0

사용 dependency injection. 이를 수행하기위한 두 가지 표준과 잘 문서화 된 옵션이 있습니다.

  1. Google Guice과 같은 프레임 워크를 사용하십시오. 이 작업을 수행하는 데 약간의 오버 헤드가 발생하지만, 더 나은 테스트 가능한 코드를 작성하는 데 도움이되며 범위 지정과 같은 멋진 기능이있어 특히 웹 레이어에 유용합니다.
  2. 데이터 소스 매개 변수 또는 데이터 소스 설정 메서드를 사용하는 생성자를 추가하여 코드에 DI를 구현합니다. 프로덕션 환경에서는 프로덕션 데이터베이스를 전달/설정하지만 단위 테스트에서는 작업/트랜잭션을 단순히 기록하는 모의 데이터 소스를 사용할 수 있습니다.
3

설명하는 바는 단위 테스트보다 더 많은 통합 테스트입니다. 단위 테스트의 경우 Spring 또는 트랜잭션 관리자를 시작하지 마십시오. 컨트롤러를 인스턴스화하고 유닛을 테스트하십시오. 통합 테스트의 경우 H2 in-memory database 만 사용하십시오. H2는 매우 빠르며 (Derby보다 훨씬 빠름) 데이터베이스가 필요할 때 테스트에 적합합니다.

+0

가능성이 있습니다. http://stackoverflow.com/questions/33612399/mock-the-spring-environment-object-in-junit-with-contextconfiguration/를 참조하십시오. 33627425 # 33627425 –

관련 문제