我有一个struts2动作的Junit 3.8测试,在我的工作空间中运行没有问题(从eclipse:右键单击> run as> Junit测试)。
为此,我使用了两个插件:<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-junit-plugin</artifactId>
<version>2.1.8</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.1.8</version>
</dependency>
下面是测试类:
package com.myapp.user.my;
import org.apache.struts2.StrutsSpringTestCase;
import com.myapp.user.action.UserAction;
import com.opensymphony.xwork2.ActionProxy;
public class TestAccountActionUsingStrutsTestCase extends StrutsSpringTestCase {
public void testUserNameErrorMessage() throws Exception {
request.setParameter("userBean.userName", "Bruc");
request.setParameter("userBean.password", "test");
ActionProxy proxy = getActionProxy("/userAction");
UserAction userAction = (UserAction) proxy.getAction();
proxy.execute();
assertTrue("Problem There were no errors present in fieldErrors but there should have been one error present", userAction.getFieldErrors().size() == 1);
assertTrue("Problem field user.userName not present in fieldErrors but it should have been",
userAction.getFieldErrors().containsKey("userBean.userName") );
System.out.println("Finish 1 test.");
}
}
接下来,我尝试调用这个测试,这次是从web应用程序(JSF托管bean)中调用。下面是我的代码,试图做到这一点(我从一个托管bean调用以下runTest()
方法):
import java.util.List;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import com.myapp.user.my.TestAccountActionUsingStrutsTestCase;
public class CallStrutsActionExecuteThruTest {
public void runTest(){
System.out.println("CallStrutsActionExecuteThruTest.runTest() is executed.");
TestAccountActionUsingStrutsTestCase test = new TestAccountActionUsingStrutsTestCase();
JUnitCore jUnitCore = new JUnitCore();
Result result = jUnitCore.run(test);
List<Failure> list = result.getFailures();
for (Failure failure : list) {
System.out.println(failure.getMessage());
}
System.out.println("Test done!");
}
}
当我访问托管bean时,我可以看到runTest()
被调用。第一个输出CallStrutsActionExecuteThruTest.runTest() is executed.
被打印到控制台。奇怪的是,下一个输出没有打印到控制台,尽管调试器显示它们被执行了。
同样,result.getFailures()
返回一个包含一个元素的列表。正如我所说,由于某种原因,它的failure.getMessage()
没有打印到控制台,但是当我在调试器中观察它时,它的值是 TestCase.fname cannot be null
。
*即使我的测试类中只有一个方法:
public void testTrue() throws Exception {
System.out.println("inside testTrue().");
assertTrue(true);
}
我仍然得到相同的结果。
我的问题是,
如果我想从JSF管理的bean中运行Struts操作测试,我是否正确使用了Junit API ?
为什么第一个输出之后的输出没有打印到控制台?
如何用值设置
TestCase.fname
?首先,我在测试类中没有看到设置这个值的方法。其次,从我的理解来看,fanme
是我要调用的测试类中测试方法的名称;和jUnitCore.run(test)
应该调用测试类test
中的所有测试方法,那么我如何只用一个fname
参数指定所有这些方法?
Download -你可以在这里下载我的项目。我使用Maven、Eclipse,并部署在Jboss 7上。
我通过以下方式访问JSF管理bean:http://localhost:8080/Struts2WithSpringDIIntegrationExampleJunitFromUI-1.0-SNAPSHOT/xhtml/hello.jsf
由于某些原因,Struts2测试不能使用原始参数。用parameterMap
代替。
Map<String, String[]> parameterMap = new HashMap<String, String[]>();
parameterMap.put("userBean.userName", new String[]{"Bruc"});
parameterMap.put("userBean.password", new String[]{"test"});
StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
request.setupGetServletPath("/userAction");
request.setParameterMap(parameterMap);