4

私は JAX-RS、JPA、GlassFish、Java DB、および NetBeans に比較的慣れていないので、自分のコードの単体テストを書きたいと思っています。[バージョン番号は下部にあります。] しかし、どこから始めればよいかわかりません。かなりの検索を行いましたが、コードの埋め込みテストをセットアップする方法をまだ明確に理解していません。私は NetBeans を使用していますが、私の質問は一般的なものです。質問をもっと明確にできたらいいのにと思いますが、これが私にできる最善のことです。これまでのところ、次の可能性のある部分を見つけました (この時点ではヒントのようなものです)。

o Maven なしでこれをセットアップしたいのですが、これは組み込みの jar を手動でインストールする必要があることを意味します。Q: どこで見つけられますか?

o GlassFish および Java DB の埋め込みバージョンを指定する構成 xml ファイル (glassfish-resources.xml および persistence.xml) のバージョンを作成します。Q: しかし、NetBeans に、インストールされたバージョンに依存する実稼働用ではなく、テスト用に使用するようにどのように指示しますか?

persistence.xml は次のようになると思います (埋め込み derby で hibernate を使用した場合):

  <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
  <property name="javax.persistence.jdbc.url" value="jdbc:derby:test"/>
  <property name="javax.persistence.jdbc.user" value="root"/>
  <property name="javax.persistence.jdbc.password" value="root"/>

o カスタム Glassfish ドメイン構成ファイルを作成します (組み込み GlassFish は Maven テスト リソースを無視します)。Q: これはどのように見えるべきですか? NetBeans のインストールで作成されたデフォルトの domain1 から domain.xml がありますが、これには多くの情報があります。

o プロジェクトが埋め込みファイルにアクセスできるようになり、それらを使用するように構成されたら、JUnit ハーネスはどのようになりますか? http://jersey.java.net/nonav/documentation/latest/client-api.html#d4e759言います:

protected void setUp() throws Exception {
  ...
    glassfish = new GlassFish(BASE_URI.getPort());
    ScatteredWar war = new ScatteredWar(...);
    glassfish.deploy(war);
  ...

ただし、EJBContainerが言及されているのも見ました(http://docs.oracle.com/javaee/6/tutorial/doc/gkcqz.htmlから):

@BeforeClass
public static void initContainer() throws Exception {
  ec = EJBContainer.createEJBContainer(); ctx = ec.getContext();
}

o JPA を使用しているため、PersistenceContext/EntityManager にアクセスする必要があります。現在、私はそれを調べています:

new InitialContext().lookup("java:module/<jax-rs resource name>");

しかし、私も見ました:

    emf = Persistence.createEntityManagerFactory("chapter02PU");

Q:これを手に入れる正しい方法は何ですか?

よろしくお願いします。

  • バージョン:
    • GlassFish サーバー オープン ソース版 3.1.2 (ビルド 23)
    • Java DB/Derby: 10.8.1.2 - (1095077)
    • NetBeans IDE 7.1 (ビルド 201112071828)
4

2 に答える 2

5

OK、GlassFish インフラストラクチャーが機能するようになり、単純なサーブレットと単純な JAX-RS サービスのテストを正常に作成できました。これを理解するのにいくらかの検索が必要だったので、他の人が使用できる場合に備えてここで共有します. JPA のテストについてはまだ掘り下げていませんが、一度に 1 つずつ説明します。私は StackOverflow を初めて使用するので、回答で多くのコードを共有するために受け入れられているプロトコルはわかりませんが、次のようになります: シンプルなサーブレットと JAX-RS リソースを提供する GlassFish 埋め込みインスタンスを起動する方法、次にそれらをテストします。パッケージは省略。埋め込み Javadoc: http://embedded-glassfish.java.net/nonav/apidocs/

1. JAX-RS を構成します。

package org.netbeans.rest.application.config;
@javax.ws.rs.ApplicationPath("resources")
public class ApplicationConfig extends javax.ws.rs.core.Application {
}

2. リソースを定義し ます。

@Path("generic")
public class GenericResource {

public static final String MESSAGE = "hi there";

public GenericResource() {
}

@GET @Produces(MediaType.TEXT_PLAIN)
public String sayHi() {
    return MESSAGE;
}
}

3. サーブレットを定義します。

package servlet;

@WebServlet(urlPatterns = {"/hello"})
public class HelloWebServlet extends HttpServlet {

 public HelloWebServlet() {
 }

@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
    PrintWriter pw = res.getWriter();
    try {
        pw.println(GenericResource.MESSAGE);
    } catch (Exception ex) {
        e.printStackTrace();
    }
}
}

4. Jersey REST クライアント、JUnit 4、http: //download.java.net/maven/glassfish/org/glassfish/extras/glassfish-embedded-all/3.1.1/glassfish-embedded-all を使用して、テストを定義します。 -3.1.1.jar

package rest;

public class NewServletTest {

private static final Logger LOG = Logger.getLogger(NewServletTest.class.getCanonicalName());
private static GlassFish glassfish = null;
private static final String WEB_APP_NAME = "RestTemp";
private static final String BASE_URI = "http://localhost:" + 8080 + "/" + WEB_APP_NAME;
private static final String REST_URI = BASE_URI + "/" + "resources" + "/" + "generic";

public NewServletTest() {
}

@BeforeClass
public static void startServer() {
    try {
        GlassFishProperties gfProps = new GlassFishProperties();
        gfProps.setPort("http-listener", 8080); // NB: not sure where name comes from - a standard property?

        glassfish = GlassFishRuntime.bootstrap().newGlassFish(gfProps);
        glassfish.start();

        Deployer deployer = glassfish.getDeployer();
        ScatteredArchive archive = new ScatteredArchive(WEB_APP_NAME, ScatteredArchive.Type.WAR);
        File buildDir = new File("build", "classes");         // NB: location depends on IDE setup
        archive.addClassPath(buildDir);
        deployer.deploy(archive.toURI());
    } catch (GlassFishException ex) {
        LOG.log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        LOG.log(Level.SEVERE, null, ex);
    }
}

@AfterClass
public static void shutDownServer() {
    if (glassfish != null) {
        try {
            glassfish.stop();
            glassfish.dispose();
            glassfish = null;
        } catch (GlassFishException ex) {
            LOG.log(Level.SEVERE, "tearDownClass(): exception: ", ex);
        }
    }
}

@Before
public void setUp() {
}

@After
public void tearDown() {
}

@Test
public void testPing() throws MalformedURLException, IOException {
    URL url = new URL(BASE_URI + "/hello");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    conn.connect();

    InputStream inputStream = conn.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
    assertEquals(GenericResource.MESSAGE, br.readLine());
}


@Test
public void testGet() {
    WebResource r = Client.create().resource(REST_URI);
    ClientResponse cr = r.accept(MediaType.TEXT_PLAIN).get(ClientResponse.class);   // GET
    String crEntityStr = cr.getEntity(String.class);
    ClientResponse.Status crStatus = cr.getClientResponseStatus();
    assertEquals(GenericResource.MESSAGE, crEntityStr);
    assertEquals(ClientResponse.Status.OK, crStatus);
}
}

このプロジェクトを NetBeans で作成するには:

  1. [新しいプロジェクト] > [Java アプリケーション] を選択します。デフォルトを取る
  2. JavaApplicationTemp を削除
  3. NetBeans を使用して、ソース パッケージ IDE フォルダー (src/ に移動します) に上記のファイルを作成します。
    • org.netbeans.rest.application.config.ApplicationConfig
    • rest.GenericResource
    • servlet.HelloWebServlet
  4. [新規] > [JUnit テスト] を選択します。デフォルトを使用し、JUnit 4.x を選択します
  5. NewEmptyJUnitTest を削除
  6. NetBeans を使用して、上記のファイルを Test Packages IDE フォルダー (test/ に移動します) に作成します。
    • rest.NewServletTest
  7. プロジェクトのプロパティを編集し、glassfish-embedded-all-3.1.1.jar を Libraries > Compile カテゴリに追加します
  8. [実行] > [プロジェクトのテスト] を選択します。理想的には、3 つの合格したテストが表示されます。

それが役立つことを願っています!

于 2012-03-12T18:43:07.157 に答える
0

Netbeans を使用している場合は、JUnit プラグインをインストールするだけです。インストールが完了したら、テスト クラスを保持するパッケージを作成し、作成したばかりのパッケージを右クリックして、[新規] > [その他] を選択します。これにより、すべてのファイル タイプがインストールされたメニューがポップアップ表示されます。JUnit パッケージまでブラウズし、右側のペインで [JUnit Test] を選択します。

これにより、JUnit クラス スタブが作成されます。ここからは、各テストのメソッドを定義し、@Test で注釈を付けるだけです。

1つだけから始めることをお勧めします。簡単なテストを作成したら、アプリケーションの上部にある [Run] メニューに移動し、[Test Project ([yourAppName])] を選択します。

うまくいけば、これがあなたを正しい道に導くでしょう。

于 2012-03-07T04:40:28.430 に答える