Как начать модульное тестирование приложения Java EE JAX-RS с использованием встроенного GlassFish и Java DB / Derby, в идеале в NetBeans без Maven? - PullRequest
4 голосов
/ 05 марта 2012

Я относительно новичок в JAX-RS, JPA, GlassFish, Java DB и NetBeans, и я хотел бы написать модульные тесты для своего кода.[Номера версий указаны внизу.] Однако я застрял на том, с чего начать.Я провел хороший поиск, но у меня пока нет ясного понимания, как настроить встроенный тест моего кода.Я использую NetBeans, но мой вопрос общий.Я хотел бы сформулировать свой вопрос более четко, но это лучшее, что я мог сделать.До сих пор я нашел следующие возможные фрагменты (больше похоже на подсказки на данный момент).

o Я хочу настроить это без Maven, но это означает, что я должен установить встроенные банки вручную. В: Где я могу их найти?

o Создать версии моих конфигурационных xml-файлов (glassfish-resources.xml и persistence.xml), в которых указываются встроенные версии GlassFish и Java DB. В: Но как вы скажете NetBeans использовать их для тестирования, а не для рабочих, которые используют установленную версию?

Я думаю, что persistence.xml будет выглядеть примерно так (из с использованием hibernate со встроенным 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 игнорирует ресурсы тестирования Maven ). В: Как это должно выглядеть?У меня есть domain.xml из домена default1, который был создан с моей установкой NetBeans, но есть много чего.

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 IЯ использую JPA, поэтому мне нужен доступ к PersistenceContext / EntityManager.В настоящее время я смотрю это через:

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

Но я также видел:

    emf = Persistence.createEntityManagerFactory("chapter02PU");

Q: Какой правильный способ получить это?

Буду очень признателен за вашу помощь.

  • Версии:
    • GlassFish Server Open Source Edition 3.1.2 (сборка 23)
    • JavaDB / Derby: 10.8.1.2 - (1095077)
    • IDE NetBeans 7.1 (сборка 201112071828)

Ответы [ 2 ]

5 голосов
/ 12 марта 2012

ОК, у меня работает инфраструктура GlassFish, и я смог успешно создать тесты для простого сервлета и простого сервиса JAX-RS.Потребовались некоторые поиски, чтобы понять это, поэтому я поделюсь здесь на случай, если другие могут использовать это.Я еще не углубился в тестирование JPA, но по одному шагу за раз.Я новичок в StackOverflow, поэтому я не знаю принятого протокола для совместного использования большого количества кода в ответе, но здесь идет речь: Как загрузить встроенный экземпляр GlassFish, который обслуживает простой сервлет и ресурс JAX-RS, затемпроверяет их.Пакеты опущены.Встроенные 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.Определите сервлет:

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.Определите тесты, используя REST-клиент Jersey, 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. выберите New> JUnit Test.принять значения по умолчанию, выбрать JUnit 4.x
  5. удалить NewEmptyJUnitTest
  6. использовать NetBeans для создания вышеуказанного файла в папке IDE тестовых пакетов (перейдет в test /):
    • rest.NewServletTest
  7. отредактируйте свойство проекта и добавьте glassfish-embedded-all-3.1.1.jar в библиотеки> категория компиляции
  8. , выберите «Выполнить»> «Тестировать проект».в идеале вы увидите три пройденных теста!

Надеюсь, это поможет!

0 голосов
/ 07 марта 2012

Если вы используете Netbeans, просто установите плагин JUnit.После установки создал пакет для хранения ваших тестовых классов, щелкните правой кнопкой мыши на пакете, который вы только что создали, и выберите «Новый-> Другой».Появится меню со всеми установленными типами файлов.Перейдите к пакету JUnit и на правой панели выберите «JUnit Test».

Это создаст заглушку класса JUnit для вас.Отсюда вам просто нужно определить метод для каждого теста и аннотировать их с помощью @ Test.

Я бы предложил начать только с одного.После того, как вы написали простой тест, перейдите в меню «Выполнить» в верхней части приложения и выберите «Тестовый проект ([yourAppName])».

Надеюсь, это сделает вас справапуть.

...