2015-02-07 1 views
0

Tomcat 7, JSP, Servlets, Log4jMySQL을 사용하여 프로젝트를하고 있습니다.Java Web Application에서 DataSource로 DAO를 테스트하는 방법은 무엇입니까?

저는 몇 시간 동안이 질문을 옳은 대답으로 봤습니다.

DataSourceJUnit을 사용하여 DAO를 테스트하려면 어떻게해야합니까?

최근에이 주소가 발견되었지만 내 용도로 구성하는 방법을 모르며 좋은 방법인지 확실하지 않습니다.

나는 다음과 같은 DAO 계층 구조에 봉착 : dao hierarchy

을 그리고 나는 다음과 같은 방법으로 AbstractRepositoryDataSource을 취득하고 있습니다 :

... 
protected final DataSource ds; 
... 
    public AbstractRepository() { 
     DataSource dataSource = null; 
     try { 
      Context initContext = new InitialContext(); 
      dataSource = (DataSource) initContext 
        .lookup("java:/comp/env/jdbc/mydb"); 
     } catch (NamingException ex) { 
      LOG.error("Cannot obtain a connection from the pool", ex); 
     } 
     ds = dataSource; 
    } 
... 

당신이 길의 일부 코드 샘플을 생산겠습니까

Entrant Repository Test에 대한 예를 들어이 문제를 해결 하시겠습니까?

답변

1

AbstractRepository에있는 코드는 테스트하기가 매우 어렵습니다. 그 이유는 데이터 소스를 어디에서 가져 오는지를 아는 "스마트 생성자"입니다. 그러나 당신은 여전히 ​​많은 옵션을 가지고 있습니다. 생성자 매개 변수로 DataSource을받을 수 있도록 당신은 그래서 당신은 몇 가지 테스트 데이터 소스와 테스트 환경에서 저장소를 초기화 할 수

public AbstractRepository(DataSource dataSource){ 
    this.ds = dataSource; 
} 

처럼 (모의를?) 코드 (내 선택)를 변경할 수 있습니다 .

또는 일부 조롱 프레임 워크를 사용할 수 있습니다. EasyMock을 사용하여 테스트하려는 저장소의 일부 모의 객체를 만듭니다. EasyMock은 기본적으로 생성자를 호출하지 않고 클래스의 부분 모크를 만듭니다. 그런 다음 getDataSource() 메서드를 조롱하거나 (테스트 데이터 소스를 반환하기 위해 데이터 소스에 액세스해야하는 모든 곳에서 사용되기를 바랍니다.) Ref30을 사용하여 최종 ds 필드를 설정할 수 있습니다 (더 나쁜 선택입니다.).

+0

내가 빈 생성자를 한 이유는 필요에 따라 자식이 DataSource를 재정의 할 수 있지만 자식이 동일한 데이터베이스를 사용하면 부모 DataSource를 사용할 수 있기 때문입니다. 비록 내가 테스트하기가 꽤 어렵다는 것에 동의한다. 이 순간에 대한 나의 목표는 JUnit (다른 테스트 프레임 워크를 사용하지 않고) – marknorkin

+0

을 사용하여 JUnit을 테스트하는 것입니다. 제안 된 생성자를 구현하면 모든 자식도 DataSource 매개 변수로 이러한 construcotor를 만들어야합니다. Connection을 패스하는 것이 더 좋은가? – marknorkin

+0

선언 된 생성자가'AbstractRepository (DataSource)'생성자 인 경우 각 서브 클래스는 명시 적으로'super (DataSource)'를 호출해야합니다. 생성자에서. AbstractDatasource를 확장 한 모든 MyRepository에 MyRepository (DataSource) 생성자를 제공하는 것이 좋습니다. 리포지토리는 DataSource의 출처를 알 필요가 없습니다. – AGV

1

문제는 코드가 소스에서 직접 종속성을 얻는다는 것입니다. 이전에 제공된 question의 조언은 Alexey Gromov의 조언과 비슷하지만 어떤 이유로 든 코드를 변경할 수없는 경우 단위 테스트에서 다음을 수행해야합니다.

1) 다음과 같은 하위 컨텍스트를 만듭니다. Java 컨테이너 (예 : Tomcat, Jetty)를 사용하여 일반적으로 만들 수 있습니다. 그는 내가 당신의 링크에서 가져온 다음 명령을 사용하여 수행 할 수 있습니다 (나는 그들이 작동 확인) :

System.setProperty(Context.INITIAL_CONTEXT_FACTORY, 
      "org.apache.naming.java.javaURLContextFactory"); 
     System.setProperty(Context.URL_PKG_PREFIXES, 
      "org.apache.naming"); 

    Context ic = new InitialContext(); 
    ic.createSubcontext("java:"); 
    ic.createSubcontext("java:/comp"); 
    ic.createSubcontext("java:/comp/env"); 
    ic.createSubcontext("java:/comp/env/jdbc"); 

2) 당신은 당신의 코드가 기대되는 이름에 모의 객체를 결합해야합니다. InitialContext # bind를 사용하여이를 수행 할 수 있습니다.

ic.bind("java:/comp/env/jdbc/DSTest", mock(DataSource.class)); 

모의 함수는 모치토에 의해 제공됩니다 ... 원하는 모의 객체를 전달할 수 있습니다.내 실제 코드에서

나는이있다 : 출력합니다

 mysqlDs = (DataSource) initCtx.lookup("java:/comp/env/jdbc/DSTest"); 
     System.out.println("----mysqlDs = " + mysqlDs + "\n"); 

: 당신은 쉽게 응용 프로그램이 실행됩니다 때와 같이 수업 내에서 톰캣 JNDI 환경에 액세스 할 수 있습니다 TomcatJNDI

----mysqlDs = Mock for DataSource, hashCode: 1926808117 
+0

답변 해 주셔서 감사합니다! 내 코드를 다시 디자인 할 수 있습니다. 그리고 나는 이미 각 저장소에 전달 된 DataSource 매개 변수를 가진 또 다른 생성자를 생성합니다. 그래서 내 테스트에서 나는 단지 MysqlDataSource 인스턴스를 생성하고 그것을 테스트 된 저장소에 전달할 수 있다고 생각하지만이 테스트를 실행할 때'NPE'를 얻는다. – marknorkin

+0

NPE는 어디에서 가져 왔으며 MysqlDataSource는 어떻게 작성하고 있습니까? –

+0

'MysqlDataSource ds = new MysqlDataSource(); ds.setServerName ("localhost"); ds.setPort (3306); ds.setDatabaseName ("mydb"); ds.setUser ("root"); ds.setPassword ("password"); userRepository = new UserRepository (ds);' JUnit으로 테스트하고 있습니다. 이것이 바로 BeforeClass에서 DataSource를 만드는 방법입니다. NPE는 생성, 업데이트, 삭제, 메소드 찾기를 던지고 있습니다. 그래서 내가 제대로 MysqlDataSource를 얻지 못하고 있다고 생각합니다. – marknorkin

0

Tomcat 내에서. TomcatJNDI는 Tomcat의 JNDI 시스템을 활용하고 원래 Tomcat 구성 파일을 처리하여 구성합니다. 사용법은 간단합니다. e. 지.

TomcatJNDI tomcatJNDI = new TomcatJNDI(); 
tomcatJNDI.processContextXml(contextXmlFile); 
tomcatJNDI.processWebXml(webXmlFile); 
tomcatJNDI.start(); 

이전과 마찬가지로 DataSource를 조회 할 수 있습니다. More information can be found here.

관련 문제