Как начать модульное тестирование приложения Java EE JAX-RS с использованием встроенного GlassFish и Java DB/Derby, в идеале в NetBeans без Maven?
Я относительно новичок в JAX-RS, JPA, GlassFish, Java DB и NetBeans, и я хотел бы написать модульные тесты для своего кода. [Номера версий указаны внизу.] Однако я застрял на том, с чего начать. Я провел хороший поиск, но у меня пока нет четкого понимания того, как настроить встроенный тест моего кода. Я использую NetBeans, но мой вопрос общий. Я хотел бы сформулировать свой вопрос более четко, но это лучшее, что я мог сделать. До сих пор я нашел следующие возможные фрагменты (больше похоже на подсказки на данный момент).
o Я хочу настроить это без Maven, но это означает, что я должен установить встроенные банки вручную. Q: Где я могу их найти?
o Создать версии моих конфигурационных xml-файлов (glassfish-resources.xml и persistence.xml), в которых указываются встроенные версии GlassFish и Java DB. Вопрос: Но как вы говорите NetBeans использовать их для тестирования, а не для рабочих, которые полагаются на их установленную версию?
Я думаю, что persistence.xml будет выглядеть примерно так (от использования 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 ( Embedded GlassFish игнорирует ресурсы тестирования Maven). Q: Как это должно выглядеть? У меня есть domain.xml из домена default1, который был создан с моей установкой NetBeans, но есть много чего.
o Как только мой проект получит доступ к встроенным файлам и настроит их использование, как должен выглядеть мой жгут JUnit? http://jersey.java.net/nonav/documentation/latest/client-api.html говорит:
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 Server Open Source Edition 3.1.2 (сборка 23)
- Java DB / Derby: 10.8.1.2 - (1095077)
- IDE NetBeans 7.1 (сборка 201112071828)
2 ответа
Хорошо, у меня работает инфраструктура GlassFish, и я смог успешно создавать тесты для простого сервлета и простого сервиса JAX-RS. Потребовались некоторые поиски, чтобы понять это, поэтому я поделюсь здесь на случай, если другие могут использовать это. Я еще не углубился в тестирование JPA, но по одному шагу за раз. Я новичок в Stackru, поэтому я не знаю принятого протокола для совместного использования большого количества кода в ответе, но здесь идет речь: Как загрузить встроенный экземпляр 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 Джерси, 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 для создания вышеуказанных файлов в папке IDE Source Packages (перейдите в src /):
- org.netbeans.rest.application.config.ApplicationConfig
- rest.GenericResource
- servlet.HelloWebServlet
- выберите New > JUnit Test. принять значения по умолчанию, выберите JUnit 4.x
- удалить NewEmptyJUnitTest
- используйте NetBeans для создания вышеуказанного файла в папке IDE Test Packages (перейдем в test /):
- rest.NewServletTest
- отредактируйте свойство проекта и добавьте glassfish-embedded-all-3.1.1.jar в категорию Библиотеки> Компиляция
- выберите "Выполнить"> "Тестовый проект". в идеале вы увидите три пройденных теста!
Надеюсь, это поможет!
Если вы используете Netbeans, просто установите плагин JUnit. После установки создал пакет для хранения ваших тестовых классов, щелкните правой кнопкой мыши на пакете, который вы только что создали, и выберите "New->Other". Появится меню со всеми установленными типами файлов. Перейдите к пакету JUnit и на правой панели выберите "Тест JUnit".
Это создаст заглушку класса JUnit для вас. Отсюда вам просто нужно определить метод для каждого теста и аннотировать их с помощью @Test.
Я бы предложил начать с одного. После того, как вы написали простой тест, перейдите в меню "Выполнить" в верхней части приложения и выберите "Тестовый проект ([yourAppName])".
Надеюсь, это укажет вам правильный путь.