2016-12-19 1 views
0

저의 저어 방법을 테스트하기위한 단위 테스트를 작성하고 저의 응용 프로그램이 실행될 때 종속성을 주입하기 위해 매우 복잡하다는 저지 응용 프로그램이 있습니다.저지 응용 프로그램에 데이터베이스 연결 팩토리 서비스를 주입하는 방법

여기 내 web.xml입니다. 패키지 스캐닝을 사용하고 있습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<!-- This web.xml file is not required when using Servlet 3.0 container, 
    see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html --> 

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <servlet> 
    <servlet-name>myapp</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>my.package.MyApplication</param-value> 
    </init-param> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value> 
     my.package 
     </param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>myapp</servlet-name> 
    <url-pattern>/api/v1/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

저는 URI를 처리 할 수있는 컨트롤러가 있습니다. 나는 단순히이 작업을 수행하는 단위 테스트가

public class Dao { 
    // I use a datasource when my app runs on tomcat, but for unit testing I spin up an in memory database and run my unit tests against that. Can't set a datasource for an in memory database 
    public static final String DATASOURCE_NAME = "jdbc/myDataSource"; 

    // Dependency to be injected 
    private ConnectionFactory connectionFactory = null; 

    public void setConnectionFactory(ConnectionFactory connectionFactory) { 
     this.connectionFactory = connectionFactory; 
    } 
... 

:

Dao dao = new Dao(); 
dao.setConnectionFactory(new DriverManagerConnectionFactory("jdbc:hsqldb:mem:mymemdb:user=SA;")); 
... 

을 내가 쉽게 내 단위 테스트를 실행할 수있는이 방법은 다음과 같습니다 내 DAO 메소드를 호출합니다. 문제는 이제 내 응용 프로그램이 깨져서 b/c입니다. 응용 프로그램을 시작할 때 또는 컨트롤러 메서드가 URI를 통해 호출 될 때 DataSourceConnectionFactory를 주입하는 방법을 알지 못합니다.

Jersey 문서는 모호하고 모호하며 실제 사례를 제공하지 않습니다. https://jersey.java.net/documentation/latest/ioc.html

내가 내 자신의 의존성 주입 롤 저지를 사용하여 작은 애플 리케이션을위한, 당신과 함께 솔직히 말해서 : 당신이 저지 2.X를 사용하는 경우

답변

0

, 지금까지 내가 말할 수있는 그들은 여기 저지 자원에 대한 의존성 주입을 포함 JSR-330 주석 또는 기타 DI 메커니즘을 사용하는 대신 공장을 사용하십시오. 저지 리소스는 POJO (AccountManager) 인스턴스를 구성하여 작업을 수행하고 POJO 생성자는 IAccountDAO와 같은 종속성을 가지며 저지 리소스는 POJO 팩토리로 이동하여 종속성을 가져옵니다. 이로 인해이 예제의 AccountManager POJO는 단위 테스트에 쉽게 적용될 수 있습니다. 하나의 모듈에 직접 연결되기보다는 생성자에 DAO가 제공되고, DI 프레임 워크와 주석을 사용하지 않아도됩니다. 기본적으로 여전히 DI이지만 프레임 워크가 없습니다. 꽤 작은 응용 프로그램을 위해서만 할 것입니다. Google Guice 또는 스프링 DI로 모든 응용 프로그램을 치는 것이 약간 과격 할 수 있다고 생각합니다. 그런 도구가 나오기 전에 DI 개념이 존재했습니다.

아래의 샘플 저지 리소스.

DependenciesFactory는 사용자 환경에 대한 종속성으로 클래스를 빌드하는 POJO입니다. 예를 들어 "TeacherDirectory"에 데이터 소스가 삽입되어야하거나 DAO에 데이터 소스가 삽입되어 있으면 DAO가 데이터 소스를 삽입해야하므로 공장에서이를 처리합니다. 싱글 톤에 대해서 생각해보아야합니다. 그렇지 않을 경우 싱글 톤으로 생각해야합니다.하지만 매우 관리하기 쉽습니다. 또한 어떤 환경에 있는지 또는 적어도 로컬 개발자 상자 대 배포되었는지 여부를 알려주는 방법이 필요합니다. 이는 모든 DI에서도 마찬가지입니다. DI는 여러 구성을 관리 할 수 ​​있으므로 여러 구성이 필요하고 직접 손으로 구르는 경우이를 처리해야합니다.

@Path("/teachers") 
public class TeacherResource { 
    private final ITeacherDirectory teacherDirectory; 

    public TeacherResource() { 
     this.teacherDirectory = DependenciesFactory.getTeacherDirectory(); 
    } 

    @GET 
    @Path("/") 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<Provider> getTeachers(@QueryParam("teacherId") String teacherId, 
             @QueryParam("firstName") String firstName, 
             @QueryParam("lastName") String lastName) { 

     return this.teacherDirectory.findTeachers(teacherId, firstName, lastName); 
    } 
+0

나는 동의합니다. 이 작업을 수행하는 방법에 대한 코드 예제를 제공 할 수 있습니까? – Catfish

+0

@ 캐쉬 피쉬 - 물론 - 아주 조심스럽게 핸드 롤링 DI를 사용하겠습니다. 매우 큰 애플리케이션의 경우 성가 시게 될 수 있습니다. 스택 오버플로 주석은 샘플 코드를위한 최선의 방법은 아닙니다. 오늘 나중에 예제를 사용하여 다른 답변을 추가하겠습니다. –

+0

다른 답을 쓰는 대신 예제 코드로 답을 편집하면됩니다. – Catfish

관련 문제