2016-12-19 13 views
0

私はダオのメソッドをテストするための単体テストを書いているので、アプリケーションの実行時に依存性を注入するために非常に複雑であることが証明されています。データベース接続ファクトリーサービスをJerseyアプリケーションに挿入する方法

ここは私の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を処理する方法を持つコントローラを持っています。

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

と私は簡単に私のユニットテストを実行することができます:私は単にこれを行うユニットテストを持っている

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のメソッドを呼び出します。問題は、今、私のアプリが壊れていることです。私は、アプリケーションが起動されたとき、またはコントローラメソッドがURIを通じて呼び出されたときに、DataSourceConnectionFactoryを挿入する方法がわかりません。

Jerseyのドキュメントはすべてあちこちにあり、あいまいであり、私が従うことができる実際の例を提供していません。 https://jersey.java.net/documentation/latest/ioc.html

は、私は自分の依存性注入をロールジャージを使用して小さなアプリケーションのために、あなたと正直に言う:あなたはジャージー2.xのを使用している場合

答えて

0

、私の知る限り、彼らはここでジャージリソースへの依存性の注入をカバーJSR-330注釈やその他のDIメカニズムを使用するのではなく、ファクトリを使用します。私のjerseyリソースは、POJO(AccountManager)のインスタンスを構築して作業を行い、POJOコンストラクタはそれに依存します(IAccountDAOなど).Jerseyリソースは依存関係を取得するためにPOJOファクトリに移動します。これにより、この例のAccountManager POJOは単体テストに簡単になります。なぜなら、直接結合されるのではなくコンストラクタにDAOが提供され、DIフレームワークとアノテーションがコードを這う必要がないからです。基本的にはDIですがフレームワークはありません。私はかなり小さなアプリのためにしかやりません - 私はGoogle GuiceやSpring DIですべてのアプリを叩くのがちょっと残念ですが、DIのコンセプトはそうしたツールの前に存在していました。

下記のサンプルジャージーリソース。

依存関係ファクトリは、環境に適切に依存するクラスを構築する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

@Catfish - 確かに - もう一度私はいくつかの注意を手渡しDIを使用するだろう - 非常に大きなアプリケーションのために、それは面倒になることができます。スタックオーバーフローのコメントは、サンプルコードにとって最善の方法ではないかもしれません。 –

+0

別の答えを書くのではなく、いくつかのサンプルコードで回答を編集するだけです。 – Catfish

関連する問題