This website uses cookies to ensure you get the best experience. Learn More.
Liferay Arquillian test cases using maven and spring
Arquillian integrates seamlessly with familiar testing frameworks (e.g., JUnit, TestNG), allowing tests to be launched using existing IDE, Ant and Maven test plugins.
Arquillian can use three containers types
1. Embedded: the test runner contains the container as a library
2. Managed: the test runner starts and stops the container as a separated process
3. Remote: the test runner relies on an operational container, already started.
There are a few steps required to setup and run Arquillian for plugin projects.
1. Adding Users to Tomcat
Arquillian will deploy the plugin inside the container which is how it has a runtime with which it can locate your dependencies from the test.
Go to your $TOMCAT_HOME/conf directory and open the tomcat-users.xml file.
If none exists, create it and add the following to the file Save and close the file
<?xml version="1.0"?>
<tomcat-users>
<role rolename="tomcat" />
<role rolename="manager-gui" />
<role rolename="manager-script" />
<role rolename="manager-jmx" />
<role rolename="manager-status" />
<user password="tomcat" roles="tomcat, manager-gui,
manager-script ,manager-jmx, manager-status"
username="tomcat"/>
</tomcat-users>
2. Add Connection for Arquillian
Arquillian is going to use the manager application of Tomcat to deploy the plugin as part of the test execution, So modify environment properties to support it.
Make sure that tomcat has manager folder in webapps directory.
Go to your $TOMCAT_HOME/bin directory and open the setenv.sh (if you are on MAC/Linux) or setenv.bat (if you are on Windows)
Add the following to the file.
JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=8099 -Dcom.sun.management.jmxremote.ssl=false"
CATALINA_OPTS="${CATALINA_OPTS} ${JMX_OPTS}"
You can alter port to use a different value other than 8099 – but this is the "default" value.
Restart your TOMCAT server to make sure the changes are picked up.
1. Open the pom.xml for your project and add below dependencies
<!-- Test Dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<groupId>org.jboss.arquillian.container</groupId>
<artifactId>arquillian-tomcat-remote-7</artifactId>
<version>1.0.0.CR7</version>
<scope>test</scope>
<groupId>org.jboss.shrinkwrap.resolver</groupId>
<artifactId>shrinkwrap-resolver-impl-maven</artifactId>
<groupId>org.jboss.arquillian.junit</groupId>
<artifactId>arquillian-junit-container</artifactId>
Note: arquillian-tomcat-remote-7 is for Container type Remote for Managed use arquillian-tomcat-managed-7 and for embedded use arquillian-tomcat-embedded-7 maven dependencies
2. Add the following dependency management node just above your listed dependencies
<dependencyManagement>
<dependencies>
<groupId>org.jboss.arquillian</groupId>
<artifactId>arquillian-bom</artifactId>
<version>1.1.11.Final</version>
<scope>import</scope>
<type>pom</type>
</dependencies>
</dependencyManagement>
3 .Now add a folder called java under the /src/test folder.
4. Add a new folder resources and create a new file called arquillian.xml and place the following contents (adjusting values based on your settings).
<?xml version="1.0" encoding="UTF-8"?>
<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">
<engine>
<property name="deploymentExportPath">target/deployments</property>
</engine>
<container qualifier="tomcat" default="true">
<configuration>
<property name="user">tomcat</property>
<property name="pass">tomcat</property>
</configuration>
</container>
</arquillian>
<property name="catalinaHome">Path of Tomcate folder</property>
<property name="catalinaBase">Path of Tomcate folder</property>
Write Unit Test Case
Click on the /test/java folder and create new test classes ArquillianDeployment.java and MyArquillianPortletTest.java
package com.arquillian.portlet.test;
import java.io.File;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.resolver.api.maven.Maven;
import org.jboss.shrinkwrap.resolver.api.maven.PomEquippedResolveStage;
public class ArquillianDeployment {
private static final String LOCAL_WEBAPP_DIR = "src/main/webapp/WEB-INF";
public static WebArchive createDeployment() {
PomEquippedResolveStage mavenResolver = Maven.resolver().loadPomFromFile("pom.xml");
File[] libs = mavenResolver.importRuntimeAndTestDependencies().resolve().withTransitivity().asFile();
WebArchive war = ShrinkWrap.create(WebArchive.class, "arquillian-test.war")
.addPackages(true,"com.arquillian.portlet.test","com.arquillian.controller")
.addAsWebInfResource(new File(LOCAL_WEBAPP_DIR, "portlet.xml"))
.addAsWebInfResource(new File(LOCAL_WEBAPP_DIR, "liferay-plugin-package.properties"))
.addAsWebInfResource(new File(LOCAL_WEBAPP_DIR, "liferay-display.xml"))
.addAsWebInfResource(new File(LOCAL_WEBAPP_DIR, "liferay-portlet.xml"))
.addAsWebInfResource(new File(LOCAL_WEBAPP_DIR+"/spring-context/portlet", "arquillian-portlet.xml"),"/spring-context/portlet/arquillian-portlet.xml")
.addAsWebInfResource(new File(LOCAL_WEBAPP_DIR+"/spring-context", "portlet-application-context.xml"),
"/spring-context/portlet-application-context.xml");
for (File file : libs) { war.addAsLibrary(file);}
return war;
}
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.arquillian.controller.PortletViewController;
@RunWith(Arquillian.class)
public class MyArquillianPortletTest {
private static Log LOGGER =
LogFactoryUtil.getLog(MyArquillianPortletTest.class);
private PortletViewController mvcPortlet;
private long userId=10101;
@Deployment(name="MyArquillian")
public static WebArchive init() {
return ArquillianDeployment.createDeployment();
@Before
public void setUp() throws Exception {
mvcPortlet = new PortletViewController();
@Test
public void testGetUserDetails(){
mvcPortlet.getUserDetails(userId);
3. Save the file
4. Execute test cases by maven clean test.
Jacoco is a free code coverage library for Java. it is very simple to add to all types of build including ANT and Maven.
<profiles>
<profile>
<id>jacoco</id>
<groupId>org.jacoco</groupId>
<artifactId>org.jacoco.core</artifactId>
<version>0.7.4.201502262128</version>
<groupId>org.jboss.arquillian.extension</groupId>
<artifactId>arquillian-jacoco</artifactId>
<version>1.0.0.Alpha8</version>
<build>
<plugins>
<plugin>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<id>report</id>
<phase>prepare-package</phase>
<goal>report</goal>
</executions>
</plugin>
</plugins>
</build>
</profile>
NOTE: