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