我有一个 Struts 2 操作的 Junit 3.8 测试,该操作在我的工作区中运行没有问题(来自 eclipse:右键单击 > 运行为 > 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)中调用的。
这是我尝试执行此操作的代码(我runTest()
从托管 bean 调用以下方法):
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
参数指定所有这些方法?
下载- 你可以在这里下载我的项目。我使用 Maven、Eclipse 并在 Jboss 7 上进行部署。
我通过以下方式访问 JSF 托管 bean:http://localhost:8080/Struts2WithSpringDIIntegrationExampleJunitFromUI-1.0-SNAPSHOT/xhtml/hello.jsf