Struts2 provides junit
plugin library, to test action classes. This tutorial will provide you an
example, how to use junit plugin in struts2.
Step 1: Create new dynamic web project.
Give the project name
as “struts_junit_tutorial” and press next.
Press next and tick the
check box “Generate web.xml deployment descriptor” and press finish.
Project structure looks
like below.
Step 2: Convert project to maven project.
Right click on the
project -> go to configure -> Convert to Maven Project
Give Group Id, Artifact Id
as “struts_junit_tutorial” and press finish.
Now, project structure
looks like below.
Step 3: Open pom.xml and update maven dependencies
for struts2 and junit plugin for struts2.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>struts_junit_tutorial</groupId> <artifactId>struts_junit_tutorial</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <properties> <struts_version>2.3.20</struts_version> </properties> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.4</version> <configuration> <warSourceDirectory>WebContent</warSourceDirectory> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>${struts_version}</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-junit-plugin</artifactId> <version>${struts_version}</version> </dependency> </dependencies> </project>
Step 3:
In struts2 environment, we have to handover the requests to struts2. We do this
by configuring web.xml.
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>struts_junit_tutorial</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <display-name>Struts2 Demo App</display-name> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
As you observe web.xml,
we are forwarding all the requests to struts2 environment by using filter
mapping. So now it is struts2 responsibility to process this request.
Step 4:
in struts2 environment, action class handles request, so we create one action
class, called NumberAction.java, in the package junit.struts.
package junit.struts; public class NumberAction { private int num; public int getNthPrime(){ int candidate, count; for(candidate = 2, count = 0; count < num; ++candidate) { if (isPrime(candidate)) { ++count; } } return candidate-1; } public static boolean isPrime(int n) { for(int i = 2; i < n; ++i) { if (n % i == 0) { return false; } } return true; } public String execute(){ if(getNthPrime() > 1000){ return "success"; } else{ return "failure"; } } public int getNum() { return num; } public void setNum(int num) { this.num = num; } }
NumberAction class
contains 3 methods.
getNthPrime : Returns
the nth prime number
isPrime : Returns true
if the number is prime, else false
execute : return succss
if the nth prime > 1000, else false.
Step 5: Before
writing and executing junit test cases for this action class, I want to show
complete application here.
Create index.html, with
following code
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="numCheck"> <input type="text" name="num" /> <input type="submit" value="submit" /> </form> </body> </html>
Create success.jsp with
following code.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h1>Hurray, your prime number greater than 1000</h1> </body> </html>
Create failure.jsp with
following code.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h1>Hmmmmm, your prime number is less than 1000</h1> </body> </html>
Step 6:
It is time to create struts.xml. Since Struts 2 requires struts.xml to be
present in classes folder. So create struts.xml file under the
WebContent/WEB-INF/classes folder. Eclipse does not create the
"classes" folder by default, so you need to do this yourself. To do
this, right click on the WEB-INF folder in the project explorer and select New
> Folder.
Create struts.xml file
inside classes.
struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default"> <action name="numCheck" class="junit.struts.NumberAction"> <result name="success">/success.jsp</result> <result name="failure">/failure.jsp</result> </action> </package> </struts>
Step 7: Run the Application. Before running
make sure, your project structure like below.
Once you ran the
application, you can able to see application in the browser like below.
Enter some number and
press submit, you will get success.jsp (or) failure.jsp depends on your input.
I entered 400 as input
and press submit, I got following screen as output.
Testing action class using junit
It is time to work with
junit to test Action class NumberAction.java
Create a package
junit.tests and create a class “TestNumberAction” inside the package
“junit.tests”.
package junit.tests; import junit.struts.NumberAction; import org.apache.struts2.StrutsTestCase; import com.opensymphony.xwork2.ActionProxy; public class TestNumberAction extends StrutsTestCase{ public void testGetNthPrime() throws Exception{ request.setParameter("num", "1"); ActionProxy proxy = getActionProxy("/numCheck"); NumberAction numberAction = (NumberAction) proxy.getAction(); proxy.execute(); assertEquals(numberAction.getNthPrime(), 2); request.setParameter("num", "5"); proxy = getActionProxy("/numCheck"); numberAction = (NumberAction) proxy.getAction(); proxy.execute(); assertEquals(numberAction.getNthPrime(), 11); } }
Before running junit
test case, make sure your struts.xml is in class path.
Add struts.xml to class path
Right click on the
project, go to properties.
Click on Java Build
Path, click on “Add Class Folder” and add classes folder to it. “classes folder
contains struts.xml.
You are all set to run
junit test case.
Right click on the
project -> Run As -> Junit Test.
No comments:
Post a Comment