Why you should use Arquillian/Junit ?
- Arquillian simplifies integration testing for Java apps
- Integrates Test runners like Junit
- Integrates Containers like JBoss,Glassfish,..
- During the deplyoment step [ @Deployment ] ShrinkWrap utility does the following
- creates a test archive on the fly like test.war,..
- adds libraries if needed: like addAsLibraries(new File(LOCAL_MAVEN_REPO + “/com/oracle/ojdbc7/12.1.0.2/ojdbc7-12.1.0.2.jar”));
- loads all classes referenced in addPackage method: .addPackage(DriverBean.class.getPackage());
- adds resources like bean.xml : .addAsWebInfResource(EmptyAsset.INSTANCE, “beans.xml”) ;
- Arquillian can inject Beans, EBJs by using Jnject annotations [ @Inject DriverBean db ] -> This makes Arquillian to a pretty cool and complete test framework
- Uses @Test annotation to find the test methods to be run
pom.xml Configuration for Arquillian, UCP, ONS and Oracle JDBC driver
<dependencyManagement>
<dependencies>
<!-- Override dependency resolver with latest version. This must go *BEFORE* the Arquillian BOM. -->
<dependency>
<groupId>org.jboss.shrinkwrap.resolver</groupId>
<artifactId>shrinkwrap-resolver-bom</artifactId>
<version>2.0.2</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.jboss.arquillian</groupId>
<artifactId>arquillian-bom</artifactId>
<version>1.1.8.Final</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ucp</artifactId>
<version>12.1.0.2</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ons</artifactId>
<version>12.1.0.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!-- Add support for enterprise feature like Transactions, EJBs -->
<dependency>
<groupId>org.jboss.arquillian.junit</groupId>
<artifactId>arquillian-junit-container</artifactId>
<scope>test</scope>
</dependency>
<!-- Add support Resolver support to load JDBC, UCP and ONS jar for Unit testing -->
<dependency>
<groupId>org.jboss.shrinkwrap.resolver</groupId>
<artifactId>shrinkwrap-resolver-depchain</artifactId>
<scope>test</scope>
<type>pom</type>
</dependency>
</dependencies>
Configure arquillian.xml [ located at src/main/resources ]
<arquillian xmlns="http://jboss.org/schema/arquillian" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://jboss.org/schema/arquillian
http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
<container qualifier="wildfly" default="true">
<configuration>
<property name="jbossHome">/usr/local/wildfly-8.2.0.Final</property>
<property name="modulePath">/usr/local/wildfly-8.2.0.Final/modules</property>
<!-- <property name="allowConnectingToRunningServer">true</property> -->
<property name="allowConnectingToRunningServer">true</property>
</configuration>
</container>
</arquillian>
Write your JAVA testing class TestDriverBean.java [ located in src/test/java ]
Source Code:
import com.hhu.DriverBean;
import java.io.File;
import javax.inject.Inject;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(Arquillian.class)
public class TestDriverBean
{
private static final String LOCAL_MAVEN_REPO =
System.getProperty("maven.repo.local") != null ?
System.getProperty("maven.repo.local") :
(System.getProperty("user.home") + File.separatorChar +
".m2" + File.separatorChar + "repository");
@Deployment
public static Archive<?> createTestArchive() {
System.out.println("****************** Inside createTestArchive()" );
System.out.println("****************** Local Maven Repsository: " + LOCAL_MAVEN_REPO );
WebArchive res = ShrinkWrap.create(WebArchive.class, "testDriverBean.war");
res.addPackage(DriverBean.class.getPackage());
res.addAsLibraries(new File(LOCAL_MAVEN_REPO + "/com/oracle/ojdbc7/12.1.0.2/ojdbc7-12.1.0.2.jar"));
res.addAsLibraries(new File(LOCAL_MAVEN_REPO + "/com/oracle/ucp/12.1.0.2/ucp-12.1.0.2.jar"));
res.addAsLibraries(new File(LOCAL_MAVEN_REPO + "/com/oracle/ons/12.1.0.2/ons-12.1.0.2.jar"));
res.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") ;
System.out.println(res.toString(true));
System.out.println("****************** Leaving createTestArchive()" );
return res;
}
@Inject DriverBean db;
@Test
public void driverTest() throws Exception
{
System.out.println("-------------- driverTest() running ---------------");
db.setPoolInfo(null);
db.setJdbcInfo(null);
db.setExceptInfo(null);
db.setClname("oracle.jdbc.OracleDriver");
String drvRet =db.checkDriver();
System.out.println("driverTest() - return : " + drvRet );
System.out.println("driverTest() - JDBC INFO : " + db.getJdbcInfo() );
System.out.println("driverTest() - Exception INFO : " + db.getExceptInfo() );
assertNull( db.getExceptInfo());
System.out.println("-------------- driverTest() finished --------------");
}
@Test
public void driverTest2() throws Exception
{
System.out.println("-------------- driverTest2() running - Creating a Class not found Exception ---------------");
// This will trigger a ClassNotFound Exception
db.setClname("This_is_not_the_Oracle_JDBC_driver_class");
db.setPoolInfo(null);
db.setJdbcInfo(null);
db.setExceptInfo(null);
String drvRet = db.checkDriver();
System.out.println("driverTest2() - return : " + drvRet );
System.out.println("driverTest2() - JDBC INFO : " + db.getJdbcInfo() );
System.out.println("driverTest2() - Exception INFO : " + db.getExceptInfo() );
assertNull( db.getExceptInfo());
System.out.println("-------------- driverTest2() finished --------------");
}
@Test
public void poolTest() throws Exception
{
System.out.println("-------------- poolTest() running ---------------");
db.setPoolInfo(null);
db.setExceptInfo(null);
db.setJdbcInfo(null);
String drvRet =db.initPool();
System.out.println("poolTest() - return : " + drvRet );
System.out.println("poolTest() - Pool INFO : " + db.getPoolInfo() );
System.out.println("poolTest() - Exception INFO : " + db.getExceptInfo() );
String RACDB = "RAC DB: BANKB";
if ( db.getPoolInfo().contains(RACDB))
System.out.println("poolTest() - found: " + RACDB);
else
{
int idx = db.getPoolInfo().indexOf("RAC DB:");
String dbFound = db.getPoolInfo().substring( idx + 8 , idx+13);
// assertFalse will fail if the checked value is ture and assertTrue will do the opposite
assertFalse("poolTest() does not found: " + RACDB + " - found: " + dbFound,true);
}
System.out.println("-------------- poolTest() finished --------------");
}
}
Code details :
@RunWith(Arquillian.class)
-> Junit will use Arquillian runner to execute this class
private static final String LOCAL_MAVEN_REPO ..
-> LOCAL_MAVEN_REPO defines our local Maven repository storing JDBC,UCP and ONS Maven archetypes
WebArchive res = ShrinkWrap.create(WebArchive.class, "testDriverBean.war");
-> Creates a Webarchive named testDriverBean.war. This War will be deployed to our Wildfly server
res.addAsLibraries(new File(LOCAL_MAVEN_REPO + "/com/oracle/ojdbc7/12.1.0.2/ojdbc7-12.1.0.2.jar"));
-> Adds a Maven archetype from our local Maven repository
System.out.println(res.toString(true));
-> Display the content of our "testDriverBean.war" War file
@Inject DriverBean db;
--> Inject DriverBean
Run the test Class
Deployment step createTestArchive() should create the following output:
Running TestDriverBean
****************** Inside createTestArchive()
****************** Local Maven Repsository: /home/oracle/.m2/repository
testDriverBean.war:
/WEB-INF/
/WEB-INF/lib/
/WEB-INF/lib/ons-12.1.0.2.jar
/WEB-INF/lib/ucp-12.1.0.2.jar
/WEB-INF/lib/ojdbc7-12.1.0.2.jar
/WEB-INF/beans.xml
/WEB-INF/classes/
/WEB-INF/classes/com/
/WEB-INF/classes/com/hhu/
/WEB-INF/classes/com/hhu/DriverBean.class
/WEB-INF/classes/com/hhu/Tools.class
****************** Leaving createTestArchive()
-> Here we can see that our Deploy Step really adds the needed JAR files to use
Oracle JDBC driver with ONS and UCP.
Running the Maven Unit Tests
$ mvn -e test
Results :
Failed tests:
poolTest(TestDriverBean): poolTest() does not found: RAC DB: BANKB - found: BANKA
driverTest2(TestDriverBean): expected null, but was:<<pre>Error in checkDriver()</pre><pre>This_is_not_the_Oracle_JDBC_driver_class from [Module "deployment.testDriverBean.war:main" from Service Module Loader]</pre><pre>java.lang.ClassNotFoundException: This_is_not_the_Oracle_JDBC_driver_class from [Module "deployment.testDriverBean.war:main" from Service Module Loader]
Tests run: 3, Failures: 2, Errors: 0, Skipped: 0
-> Two out of our three tests failed:
The failed test are : poolTest(TestDriverBean) and driverTest2(TestDriverBean)
Review driverTest() method
Source Code:
@Test
public void driverTest() throws Exception
{
System.out.println("-------------- driverTest() running ---------------");
db.setPoolInfo(null);
db.setJdbcInfo(null);
db.setExceptInfo(null);
db.setClname("oracle.jdbc.OracleDriver");
String drvRet =db.checkDriver();
System.out.println("driverTest() - return : " + drvRet );
System.out.println("driverTest() - JDBC INFO : " + db.getJdbcInfo() );
System.out.println("driverTest() - Exception INFO : " + db.getExceptInfo() );
assertNull( db.getExceptInfo());
System.out.println("-------------- driverTest() finished --------------");
}
Methode driverTest() - prints out the following to Wildfly Server logs
14:26:40,760 INFO [stdout] (default task-4) -------------- driverTest() running ---------------
14:26:40,761 INFO [stdout] (default task-4) driverTest() - return : index
14:26:40,762 INFO [stdout] (default task-4) driverTest() - JDBC INFO :
<pre>JDBC Driver Check - Loading Driver class ok : oracle.jdbc.OracleDriver</pre>
<pre>JDK Version: 1.7.0_71</pre>
<pre>ClassPath : /usr/local/wildfly-8.2.0.Final/jboss-modules.jar</pre>
<pre>Driver Name : Oracle JDBC driver</pre>
<pre>Driver Version : 12.1.0.2.0</pre>
<pre>Database Product Version: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
14:26:40,762 INFO [stdout] (default task-4) With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
14:26:40,762 INFO [stdout] (default task-4) Advanced Analytics and Real Application Testing options</pre>
14:26:40,762 INFO [stdout] (default task-4) driverTest() - Exception INFO : null
14:26:40,763 INFO [stdout] (default task-4) -------------- driverTest() finished --------------
--> This test runs successfully as we have provided the correct Classname for the Oracle JDBC driver !
Review driverTest2() method
Source Code:
public void driverTest2() throws Exception
{
System.out.println("-------------- driverTest2() running - Creating a Class not found Exception ---------------");
// this creates a ClassNotFoundException
db.setClname("This_is_not_the_Oracle_JDBC_driver_class");
db.setPoolInfo(null);
db.setJdbcInfo(null);
db.setExceptInfo(null);
String drvRet = db.checkDriver();
System.out.println("driverTest2() - return : " + drvRet );
System.out.println("driverTest2() - JDBC INFO : " + db.getJdbcInfo() );
System.out.println("driverTest2() - Exception INFO : " + db.getExceptInfo() );
assertNull( db.getExceptInfo());
System.out.println("-------------- driverTest2() finished --------------");
}
-> - db.checkDriver() does not throw an exception as checkDriver() is a top level JSF function.
- Instead all Exceptions are stored in an Exception String.
- If all works db.getExceptInfo() should be still a null string.
- If not db.getExceptInfo() returns the Exception and the later JUnit test:
:
assertNull( db.getExceptInfo()); will fail
Methode driverTest2() - prints out the following to Wildfly Server logs
14:43:14,483 INFO [stdout] (default task-5) -------------- driverTest2() running - Creating a Class not found Exception ---------------
14:43:14,486 INFO [stdout] (default task-5) driverTest2() - return : index
14:43:14,486 INFO [stdout] (default task-5) driverTest2() - JDBC INFO : null
14:43:14,486 INFO [stdout] (default task-5) driverTest2() - Exception INFO : <pre>Error in checkDriver()</pre><pre>This_is_not_the_Oracle_JDBC_driver_class from [Module "deployment.testDriverBean.war:main" from Service Module Loader]</pre><pre>java.lang.ClassNotFoundException: This_is_not_the_Oracle_JDBC_driver_class from [Module "deployment.testDriverBean.war:main" from Service Module Loader]
14:43:14,487 INFO [stdout] (default task-5) at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:213)
14:43:14,487 INFO [stdout] (default task-5) at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:459)
14:43:14,487 INFO [stdout] (default task-5) at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:408)
14:43:14,487 INFO [stdout] (default task-5) at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:389)
14:43:14,487 INFO [stdout] (default task-5) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:134)
14:43:14,487 INFO [stdout] (default task-5) at java.lang.Class.forName0(Native Method)
14:43:14,488 INFO [stdout] (default task-5) at java.lang.Class.forName(Class.java:191)
14:43:14,488 INFO [stdout] (default task-5) at com.hhu.DriverBean.checkDriver(DriverBean.java:163)
--> The stack shows we are failing in line 163 com.hhu.DriverBean.checkDriver because assertNull( db.getExceptInfo()); founds
that db.getExceptInfo() is not null
Review poolTest() method
Source Code:
@Test
public void poolTest() throws Exception
{
System.out.println("-------------- poolTest() running ---------------");
db.setPoolInfo(null);
db.setExceptInfo(null);
db.setJdbcInfo(null);
String drvRet =db.initPool();
System.out.println("poolTest() - return : " + drvRet );
System.out.println("poolTest() - Pool INFO : " + db.getPoolInfo() );
System.out.println("poolTest() - Exception INFO : " + db.getExceptInfo() );
String RACDB = "RAC DB: BANKB";
if ( db.getPoolInfo().contains(RACDB))
System.out.println("poolTest() - found: " + RACDB);
else
{
int idx = db.getPoolInfo().indexOf("RAC DB:");
String dbFound = db.getPoolInfo().substring( idx + 8 , idx+13);
// assertFalse will fail if the checked value is ture and assertTrue will do the opposite
assertFalse("poolTest() does not found: " + RACDB + " - found: " + dbFound,true);
}
System.out.println("-------------- poolTest() finished --------------");
}
}
Methode poolTest() - prints out the following to Wildfly Server logs
14:43:12,559 INFO [stdout] (default task-10) -------------- poolTest() running ---------------
14:43:13,129 INFO [oracle.ucp.common.UniversalConnectionPoolBase] (default task-10) inactive connection timeout timer scheduled
14:43:14,382 INFO [stdout] (default task-10) poolTest() - return : index
14:43:14,385 INFO [stdout] (default task-10) poolTest() - Pool INFO : <pre>Initializing UCP Pool in progress ...</pre>
<pre>UCP Pool initialized ! </pre> RAC DB: BANKA
<pre>Instance Name:bankA_2 - Host: hract22.example.com</pre>
<pre>Instance Name:bankA_1 - Host: hract21.example.com</pre>
<pre>Instance Name:bankA_1 - Session Count 1</pre>
<pre>Instance Name:bankA_2 - Session Count 49</pre>
14:43:14,386 INFO [stdout] (default task-10) poolTest() - Exception INFO : null
--> poolTest() found RAC DB: BANKA but tested for Database name BANKB.
This makes assertFalse() failing and reporting a test failure !
Note: In this case we will not reach the statement :
System.out.println("-------------- poolTest() finished --------------");
The Assert itself reports :
Failed tests: poolTest(TestDriverBean): poolTest() does not found: RAC DB: BANKB - found: BANKA
Summary
- run Maven at least with -e switch to get a stack trace
- careeful read the Maven test summary : Tests run: 3, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 10.197 sec <<< FAILURE! –> Results-> Failed tests
- Check the Server logfile for stack traces
Download Source
Project Object Modul ./pom.xml
Arquillian Config file ./src/main/resources/arquillian.xml
JSF file ./src/main/webapp/index.xhtml
Java Test program ./src/test/java/TestDriverBean.java
Java Bean ./src/main/java/com/hhu/DriverBean.java
Reference