0

ワークスペースから問題なく実行される Struts 2 アクションの Junit 3.8 テストがあります (Eclipse から: 右クリック > run as > junit テスト)。

このために、2 つのプラグインを使用します。

<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!");
    }

}

runTest()マネージド Bean にアクセスすると、それが呼び出されていることがわかります。最初の出力CallStrutsActionExecuteThruTest.runTest() is executed.はコンソールに表示されます。奇妙なことに、次の出力はコンソールに出力されませんが、デバッガーはそれらが実行されていることを示しています。

また、result.getFailures()要素が 1 つのリストを返します。私が言ったように、failure.getMessage()何らかの理由でコンソールに出力されませんが、デバッガーで見ると、その値はTestCase.fname cannot be null.

*テストクラスにメソッドが 1 つしかない場合でも:

public void testTrue() throws Exception {

    System.out.println("inside testTrue().");

    assertTrue(true);
}

それでも同じ結果が得られます。

私の質問は、

  1. JSF マネージド Bean から Struts アクション テストを実行したい場合、Junit API を正しく使用していますか?

  2. 最初の出力に続く出力がコンソールに出力されなかったのはなぜですか?

  3. 値を設定するにはどうすればよいTestCase.fnameですか? まず、テスト クラスにこの値を設定するメソッドがありません。2 つ目は、私の理解でfanmeは、呼び出したいテスト クラスのテスト メソッドの名前です。jUnitCore.run(test)テストクラスのすべてのテストメソッドを呼び出す必要があるため、これらすべてのメソッドを1つのパラメーター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 に答える