blob: ad327c30d185305900f4f3f6ca90616db2a81fd6 [file] [log] [blame]
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
= Testing a Maven Enterprise Application
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Testing a Maven Enterprise Application - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Testing a Maven Enterprise Application
This tutorial demonstrates how to test a simple enterprise application using NetBeans IDE and Maven archetypes. In this tutorial you create an enterprise application that contains an entity class and a session bean. You will use a wizard to create a simple test class for the bean class and then run the test in the IDE. The test class will create an instance of the GlassFish embedded EJB container to test the connection to the database.
NOTE: If you are using GlassFish 3.1.x, please see link:../../73/javaee/maven-entapp-testing.html[+Testing a Maven Enterprise Application with Embedded GlassFish Server 3.1+]
*Tutorial Exercises*
* <<intro,Using Maven in the IDE>>
* <<Exercise_1,Creating the Enterprise Application>>
* <<Exercise_1a,Creating the Web Project>>
* <<Exercise_1b,Creating the Entity Class>>
* <<Exercise_1c,Creating the Session Bean>>
* <<Exercise_2,Creating the Session Bean Test>>
*To follow this tutorial, you need the following software and resources.*
|===
|Software or Resource |Version Required
|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |7.4, 8.0, Java EE bundle
|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java Development Kit (JDK)+] |version 7 or 8
|GlassFish Server Open Source Edition |4.0
|===
NOTE: The installer for GlassFish Server is included when you download the Java EE bundle. You can install and register GlassFish as part of the NetBeans IDE installation process.
*Prerequisites*
This document assumes you have some basic knowledge of, or programming experience with, the following technologies:
* Java Programming
* NetBeans IDE
Before starting this tutorial you may want to familiarize yourself with the following documentation.
* link:http://wiki.netbeans.org/MavenBestPractices[+Best Practices for Apache Maven in NetBeans IDE+]
* link:http://books.sonatype.com/mvnref-book/reference/introduction.html[+Chapter 1. Introducing Apache Maven+] (from link:http://books.sonatype.com/mvnref-book/reference/index.html[+Maven: The Complete Reference +])
== Using Maven in the IDE
Support for Maven is fully integrated in NetBeans IDE. Developing a project that uses the Maven framework is nearly identical to developing a project in Ant. However, there are some differences that are related to the way Maven builds projects and works with dependencies. The following tips can help you avoid some problems if you are creating a Maven application for the first time.
*Check your Maven settings*
If this is your first Maven project you will want to check the Maven configuration settings in the Options window. To complete this tutorial you must have Maven installed on your local system. Maven is bundled with the IDE and installed when you install the IDE.
1. Open the Options window in the IDE (Tools > Options; NetBeans > Preferences on Mac).
2. Select the Java category in the Options window and click the Maven tab.
3. Confirm that a Maven Home is specified.
You can use the Maven version bundled with the IDE or specify the location of a local Maven installation (requires 2.0.9 or newer).
. Click OK to close the Options window.
NOTE: Maven support is automatically enabled when Java is enabled in the IDE. You will need to enable the Java EE plugin if it is not enabled.
*Update your Maven repositories*
Local and remote Maven repositories are used for code completion and when building projects. You should update the indexes for the Maven remote repositories to ensure that any artifacts you may need are readily available when you develop your project. You can configure how often the IDE checks for updates in the Maven tab of the Options window. You can perform an immediate check for updates and explore your local and remote Maven repositories in the Services window.
1. Choose Window > Services to open the Services window.
2. Expand the Maven Repositories node in the Services window.
3. Right-click the repository node and choose Update Index in the popup menu.
When you click Update Indexes, the IDE will check and download the most recent index for each of your Maven remote repositories. An index represents the current state of the artifacts located in the repository and is used to provide a reference to the artifacts that are available to your application. By default, the IDE does not download an artifact from a repository until the artifact is explicitly required.
NOTE: Indexes are quite large and it can take some time to update them all.
For more details about using Maven in NetBeans IDE, see the section on link:https://netbeans.org/kb/docs/java/maven-hib-java-se.html#02[+Configuring Maven+] in the link:https://netbeans.org/kb/docs/java/maven-hib-java-se.html[+Creating a Maven Swing Application Using Hibernate+] tutorial and also link:http://wiki.netbeans.org/MavenBestPractices[+Best Practices for Apache Maven in NetBeans IDE+].
== Creating the Enterprise Application
In this section you create a simple web application that contains an entity class and a session bean that accesses the entity class.
=== Creating the Web Project
In this exercise you use the New Project wizard to create a Java EE web application from a Maven archetype. When you create the project with the wizard you will specify GlassFish Server as the target server.
1. Choose File > New Project (Ctrl-Shift-N; ⌘-Shift-N on Mac) from the main menu to open the New Project wizard.
2. Select Web Application in the Maven category. Click Next.
3. Name the project *mavenwebtestapp* and set the project location. Click Next.
4. Select the GlassFish Server in the Server dropdown list.
5. Select Java EE 6 Web or Java EE 7 Web in the Java EE Version dropdown list. Click Finish.
When you click Finish the IDE creates the web application and opens the project in the Projects window.
image::images/maven-testing-projects.png[title="Projects window showing generated projects"]
If you expand the project node in the Projects window you can see that the ``javaee-web-api`` JAR is listed as a project dependency and that the JDK is listed as a Java dependency. The IDE generated the project POM ( ``pom.xml`` ) and the file is listed under the Project Files node.
=== Creating the Entity Class
In this exercise you use the New File wizard to create an entity class. When you create the entity class you will select the ``jdbc/sample`` datasource in the wizard. You do not need to create or register a new datasource because the ``jdbc/sample`` datasource was registered when you installed the server.
NOTE: If you want to create a new datasource or use a different datasource, the datasource must be registered on the server before you test the application using the embedded container. When testing the application using the embedded container the IDE will not register the datasource for you as it does when deploying to a GlassFish server instance.
1. Right-click the project node and choose New > Entity Class.
Alternatively, you can choose File > New File (Ctrl-N; ⌘-N on Mac) from the main menu and select Entity Class in the Persistence category.
. Type *MyEntity* for the Class Name.
. Select ``com.mycompany.mavenwebtestapp`` as the Package and set the Primary Key Type to * ``int`` *.
. Confirm that Create Persistence Unit is selected. Click Next.
. Select *jdbc/sample* in the Data Source dropdown list.
. Confirm that Use Java Transaction APIs is selected and select Drop and Create as the Table Generation Strategy. Click Finish.
image::images/maven-testing-pu.png[title="Projects window showing generated projects"]
When you click Finish the IDE generates the MyEntity class and opens the class in the source editor. The IDE adds the ``eclipselink`` , ``javax.persistence`` and ``org.eclipse.persistence.jpa.modelgen.processor`` artifacts as project dependencies.
. In the source editor, add the private field ``name`` to the class.
[source,java]
----
private String name;
----
. Right-click in the editor and choose Getter and Setter in the Insert Code popup menu (Alt-Insert; Ctrl-I on Mac) to generate a getter and setter for the ``name`` field.
. Add the following constructor.
[source,java]
----
public MyEntity(int id) {
this.id = id;
name = "Entity number " + id + " created at " + new Date();
}
----
. Add the following ``@NamedQueries`` and ``@NamedQuery`` annotations (in bold) to create a named SQL query that will find all records in the MyEntity table.
[source,java]
----
@Entity
*@NamedQueries({
@NamedQuery(name = "MyEntity.findAll", query = "select e from MyEntity e")})*
public class MyEntity implements Serializable {
----
. Click the hint in the left margin next to the class declaration and choose the *Create default constructor* hint.
image::images/maven-testing-createconstructor.png[title="Projects window showing generated projects"]
. Fix the import statements (Ctrl-Shift-I; ⌘-Shift-I on Mac) to add import statements for ``javax.persistence.NamedQuery`` , ``javax.persistence.NamedQueries`` and ``java.util.Date`` . Save your changes.
=== Creating the Session Bean
In this exercise you will use a wizard to create a session facade for the ``MyEntity`` entity class. When you use the wizard to generate the facade the IDE will also generate an abstract facade that contains some methods such as ``create`` and ``find`` that are commonly used when accessing entity classes. You will then add two methods to the facade.
1. Right-click the project node and choose New > Other.
Alternatively, you can choose File > New File (Ctrl-N; ⌘-N on Mac) from the main menu to open the New File wizard.
. Select Session Beans For Entity Classes in the Enterprise JavaBeans category. Click Next.
. Select the ``MyEntity`` class from the list of Available Entity Classes and click Add. Click Next.
. Use the default properties in the Generated Session Beans panel of the wizard. Click Finish.
When you click Finish the IDE generates ``AbstractFacade.java`` and ``MyEntityFacade.java`` in the ``com.mycompany.mavenwebtestapp`` package and opens the classes in the source editor.
In the source editor you can see that the IDE generated code for ``EntityManager`` and added the ``@PersistenceContext`` annotation to specify the persistence unit.
[source,java]
----
@Stateless
public class MyEntityFacade extends AbstractFacade<MyEntity> {
@PersistenceContext(unitName = "com.mycompany_mavenwebtestapp_war_1.0-SNAPSHOTPU")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public MyEntityFacade() {
super(MyEntity.class);
}
}
----
. Add the following methods to ``MyEntityFacade.java`` .
[source,java]
----
@PermitAll
public int verify() {
String result = null;
Query q = em.createNamedQuery("MyEntity.findAll");
Collection entities = q.getResultList();
int s = entities.size();
for (Object o : entities) {
MyEntity se = (MyEntity) o;
System.out.println("Found: " + se.getName());
}
return s;
}
@PermitAll
public void insert(int num) {
for (int i = 1; i <= num; i++) {
System.out.println("Inserting # " + i);
MyEntity e = new MyEntity(i);
em.persist(e);
}
}
----
. Fix your imports to add the required import statements. Save your changes.
image::images/maven-testing-fiximports.png[title="Projects window showing generated projects"]
NOTE: Confirm that * ``javax.persistence.Query`` * is selected in the Fix All Imports dialog box.
== Creating the Session Bean Test
In this section you will create a JUnit test class for the ``MyEntityFacade`` session facade. The IDE will generate skeleton test methods for each of the methods in the facade class as well as each of the methods in the abstract facade. You will annotate the test methods that are generated for the methods in the abstract facade to instruct the IDE and the JUnit test runner to ignore them. You will then modify the test method for the ``verify`` method that you added to ``MyEntityFacade`` .
In the generated tests you will see that the IDE automatically adds code that calls on ``EJBContainer`` to create an instance of the EJB container.
1. Right-click ``MyEntityFacade.java`` in the Projects window and choose Tools > Create Tests.
2. Select a test framework from the Framework dropdown list
3. Use the default options in the Create Tests dialog box. Click OK.
NOTE: The first time that you create a JUnit test you need to specify the version of the JUnit framework. Select JUnit 4.x as the JUnit version and click Select.
By default, the IDE generates a skeleton test class that contains tests for each of the methods in ``MyEntityFacade`` and ``AbstractFacade`` . The IDE automatically adds a dependency on the JUnit 4.10 to the POM.
. Annotate each of the test methods except ``testVerify`` with the ``@Ignore`` annotation. The IDE will skip each of the tests annotated with ``@Ignore`` when running the tests.
Alternatively, you can delete all the test methods except ``testVerify`` .
. Locate the ``testVerify`` test method in the test class.
You can see that the test contains a line that calls on ``EJBContainer`` .
[source,java]
----
@Test
public void testVerify() throws Exception {
System.out.println("verify");
EJBContainer container = javax.ejb.embeddable.EJBContainer.createEJBContainer();
MyEntityFacade instance = (MyEntityFacade)container.getContext().lookup("java:global/classes/MyEntityFacade");
int expResult = 0;
int result = instance.verify();
assertEquals(expResult, result);
container.close();
// TODO review the generated test code and remove the default call to fail.
fail("The test case is a prototype.");
}
----
. Make the following changes (in bold) to the skeleton of the ``testVerify`` test method.
[source,java]
----
@Test
public void testVerify() throws Exception {
System.out.println("verify");
EJBContainer container = javax.ejb.embeddable.EJBContainer.createEJBContainer();
MyEntityFacade instance = (MyEntityFacade)container.getContext().lookup("java:global/classes/MyEntityFacade");
*System.out.println("Inserting entities...");
instance.insert(5);*
int result = instance.verify();
*System.out.println("JPA call returned: " + result);
System.out.println("Done calling EJB");
Assert.assertTrue("Unexpected number of entities", (result == 5));*
container.close();
}
----
. Fix the import statements to add ``junit.framework.Assert`` . Save your changes.
You now need to modify the POM to add a dependency on the ``<glassfish.embedded-static-shell.jar>`` that is located in your local installation of the GlassFish server.
. Open ``pom.xml`` in the editor and locate the ``<properties>`` element.
[source,xml]
----
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
----
. Edit the ``<properties>`` element to add the ``<glassfish.embedded-static-shell.jar>`` element (in *bold*) that specifies the location of the JAR in your local GlassFish installation. You will then reference this property in the dependency on the artifact.
[source,xml]
----
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
*<glassfish.embedded-static-shell.jar>_<INSTALLATION_PATH>_/glassfish-4.0/glassfish/lib/embedded/glassfish-embedded-static-shell.jar</glassfish.embedded-static-shell.jar>*
</properties>
----
NOTE: ``_<INSTALLATION_PATH>_`` is the absolute path to your local GlassFish installation. You will need to modify this element in the POM if the path to the local installation changes.
. Right-click the Dependencies node in the Projects window and choose Add Dependency.
. In the Add Dependency dialog box, type *embedded-static-shell* in the Query text field.
. Locate the 4.0 JAR in the search results and click Add.
image::images/add-shell-dependency.png[title="Test Results window"]
When you click Add the IDE adds the dependency to the POM.
You now want to modify the POM to specify the local installation of GlassFish as the source for the JAR.
. Locate the dependency in the POM and make the following changes (in *bold*) to modify the element to reference the ``<glassfish.embedded-static-shell.jar>`` property that you added and to specify the ``<scope>`` . Save your changes.
[source,xml]
----
<dependency>
<groupId>org.glassfish.main.extras</groupId>
<artifactId>glassfish-embedded-static-shell</artifactId>
<version>4.0</version>
*<scope>system</scope>
<systemPath>${glassfish.embedded-static-shell.jar}</systemPath>*
</dependency>
----
. In the Services window, right-click the GlassFish Server node and choose Start.
The JavaDB database server will also start when you start the GlassFish Server.
. In the Projects window, right-click the project node and choose Test.
When you choose Test the IDE will build application and run the test phase of the build lifecycle. The unit tests will be executed with the surefire plugin, which supports running JUnit 4.x tests. For more about the surefire plugin, see link:http://maven.apache.org/plugins/maven-surefire-plugin/[+http://maven.apache.org/plugins/maven-surefire-plugin/+].
You can see the results of the test in the Test Results window. You can open the Test Results window by choosing Window > Output > Test Results from the main menu.
image::images/maven-test-results.png[title="Test Results window"]
In the Test Results window you can click the Show Passed icon (image:images/test-ok_16.png[title="Show Passed icon"]) to display a list of all the tests that passed. In this example you can see that nine tests passed. If you look in the Output window you can see that only one test was run and eight tests were skipped. Skipped tests are included in the list of tests that passed in the Test Results window.
[source,java]
----
Running com.mycompany.mavenwebtestapp.MyEntityFacadeTest
verify
...
Inserting entities...
Inserting # 1
Inserting # 2
Inserting # 3
Inserting # 4
Inserting # 5
Found: Entity number 2 created at Wed Oct 09 19:06:59 CEST 2013
Found: Entity number 4 created at Wed Oct 09 19:06:59 CEST 2013
Found: Entity number 3 created at Wed Oct 09 19:06:59 CEST 2013
Found: Entity number 1 created at Wed Oct 09 19:06:59 CEST 2013
Found: Entity number 5 created at Wed Oct 09 19:06:59 CEST 2013
JPA call returned: 5
Done calling EJB
...
Results :
Tests run: 9, Failures: 0, Errors: 0, Skipped: 8
----
link:/about/contact_form.html?to=3&subject=Feedback:%20Creating%20an%20Enterprise%20Application%20Using%20Maven[+Send Feedback on This Tutorial+]
== See Also
For more information about using NetBeans IDE to develop Java EE applications, see the following resources:
* link:javaee-intro.html[+Introduction to Java EE Technology+]
* link:javaee-gettingstarted.html[+Getting Started with Java EE Applications+]
* link:maven-entapp.html[+Creating an Enterprise Application Using Maven+]
* link:../../trails/java-ee.html[+Java EE &amp; Java Web Learning Trail+]
You can find more information about using Enterprise Beans in the link:http://download.oracle.com/javaee/6/tutorial/doc/[+Java EE 6 Tutorial+].
To send comments and suggestions, get support, and keep informed on the latest developments on the NetBeans IDE Java EE development features, link:../../../community/lists/top.html[+join the nbj2ee mailing list+].