0

我有一个 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);
}

我仍然得到相同的结果。

我的问题是,

  1. 如果我想从 JSF 托管 bean 运行 Struts 操作测试,我是否正确使用了 Junit API?

  2. 为什么第一个输出之后的输出没有打印到控制台?

  3. 如何设置TestCase.fname值?首先,我在我的测试类中没有看到设置这个值的方法。其次,据我了解,fanme是我要调用的测试类中的测试方法的名称;并且jUnitCore.run(test)应该调用测试类中的所有测试方法test,那么如何仅使用一个fname参数指定所有这些方法?

下载- 你可以在这里下载我的项目。我使用 Maven、Eclipse 并在 Jboss 7 上进行部署。

我通过以下方式访问 JSF 托管 bean:http://localhost:8080/Struts2WithSpringDIIntegrationExampleJunitFromUI-1.0-SNAPSHOT/xhtml/hello.jsf

4

1 回答 1

0

出于某种原因,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);
于 2013-04-14T14:35:27.553 回答