jakarta-ee - 如何开始使用嵌入式 GlassFish 和 Java DB/Derby 对 Java EE JAX-RS 应用程序进行单元测试,最好是在没有 Maven 的 NetBeans 中?

标签 jakarta-ee jax-rs javadb glassfish-embedded

我对 JAX-RS、JPA、GlassFish、Java DB 和 NetBeans 比较陌生,我想为我的代码编写单元测试。 [版本号在底部。] 但是,我不知道从哪里开始。我已经做了很多搜索,但我还没有清楚地了解如何设置我的代码的嵌入式测试。我正在使用 NetBeans,但我的问题很笼统。我希望我能更清楚地提出我的问题,但这是我能做的最好的。到目前为止,我已经找到了以下可能的部分(此时更像是提示)。

o 我想在没有 Maven 的情况下进行设置,但这意味着我必须手动安装嵌入式 jar。问:我在哪里可以找到它们?

o 创建我的配置 xml 文件(glassfish-resources.xml 和 persistence.xml)的版本,指定 GlassFish 和 Java DB 的嵌入式版本。问:但是您如何告诉 NetBeans 使用那些进行测试而不是依赖于已安装版本的生产?

我认为 persistence.xml 看起来像这样(来自 using hibernate with embedded derby ):

  <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 域配置文件 (Embedded GlassFish ignores Maven test resources)。问:这应该是什么样子?我有来自使用我的 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");

问:掌握这个的正确方法是什么?

我将衷心感谢您的帮助。
  • 版本:
  • GlassFish Server 开源版 3.1.2(内部版本 23)
  • Java DB/ Derby :10.8.1.2 - (1095077)
  • NetBeans IDE 7.1(内部版本 201112071828)
  • 最佳答案

    好的,我让 GlassFish 基础设施正常工作,并且能够成功地为一个简单的 servlet 和一个简单的 JAX-RS 服务创建测试。花了一些时间来解决这个问题,所以我会在这里分享以防其他人可以使用它。我还没有深入研究 JPA 测试,但一步一步来。我是 StackOverflow 的新手,所以我不知道在答案中共享大量代码的公认协议(protocol),但这里有:如何启动提供简单 servlet 和 JAX-RS 资源的 GlassFish 嵌入式实例,然后测试他们。包裹省略。嵌入式 javadocs: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. 定义servlet:
    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 中创建此项目:
  • 选择新建项目 > Java 应用程序。采用默认值
  • 删除 JavaApplicationTemp
  • 使用 NetBeans 在 Source Packages IDE 文件夹中创建上述文件(将进入 src/):
  • org.netbeans.rest.application.config.ApplicationConfig
  • rest.GenericResource
  • servlet.HelloWebServlet
  • 选择新建 > JUnit 测试。取默认值,选择 JUnit 4.x
  • 删除 NewEmptyJUnitTest
  • 使用 NetBeans 在 Test Packages IDE 文件夹中创建上述文件(将进入 test/):
  • rest.NewServletTest
  • 编辑项目的属性并将 glassfish-embedded-all-3.1.1.jar 添加到库 > 编译类别
  • 选择运行 > 测试项目。理想情况下,您会看到三个通过的测试!

  • 希望有帮助!

    关于jakarta-ee - 如何开始使用嵌入式 GlassFish 和 Java DB/Derby 对 Java EE JAX-RS 应用程序进行单元测试,最好是在没有 Maven 的 NetBeans 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9569153/

    相关文章:

    jboss - JNDI - 它是如何工作的

    java - 如何防止在数据库中快速连续创建重复条目? (日本公共(public)事务局)

    java - Log4J fileappender 无法在 Websphere 7 上滚动

    java - 通常如何处理 CXF 请求处理程序中的输入参数?

    java - JerseyTest 在 Jersey 2.13 中使用 GrizzlyWebTestContainerFactory

    rest - JAX-RS 通用响应和接口(interface)代理

    android - Java DB/Apache Derby 与 Android

    JavaDB 不会在应用程序启动时启动,给我一个 java.sql.SQLNonTransientConnectionException :

    Java - 对象值属性

    java - 如何以小写名称创建表 - JavaDB/Derby?