m-namikiの日記

おもしろき こともなき世を おもしろく

mvn test実行に失敗

ActionのテストをEclipse上のjUnitで実行したときは成功したが、mvn testを実行したときに失敗するという事があった。失敗したのは想定したエラーメッセージがActionErrorsに含まれているかをテストしている場合。
まず、テスト対象のLoginActionはこんな感じ。

public String userId;
public String password;
public ValidationRules loginValidation = new DefaultValidationRules() {
    @Override
    public void initialize() {
        add("userId", new RequiredValidator());
        add("password", new RequiredValidator());
    }
};
@Validation(rules="loginValidation" errorPage="/login/login.html")
public ActionResult process() {
  :
  :
}

上記の状態で、userIdが未入力の場合に入力画面に遷移することとエラーメッセージが設定されていることを検証するテストケース。

public void testProcess_ユーザーID未入力() throws Exception {
    getRequest().setParameter("userId", "");
    getRequest().setParameter("password", "aaaaa");
    ActionResult result = processAction("/login/process");
    // 遷移先の検証
    assertPathEquals(Forward.class, "/login/login.html", result);
    // エラーメッセージの検証
    ActionErrors errors = action.getErrors();
    List<String> list = errors.getAll();
    assertTrue("userId用のエラーメッセージが含まれていること"
            , list.contains("ユーザーIDは必須です。");
}

messages.propertiesはcubby-exampleのに項目名を加えた形で、以下のようになっている。

valid.required={0}は必須です。
# 項目名
userId=ユーザーID

jUnitの場合だと上記のテストケースで問題なく成功したが、mvn testの場合は失敗となってしまった。listの内容がどうなっているか出力してみたところ、以下のようになっていた。

userIdは必須です。

ちょっと調べてみると、mvn testはシステムクラスローダーが利用されずに、実体であるmaven-surefire-plugin内蔵のクラスローダーが利用されているらしい。それが悪さをしているかどうかは分からないけど、jUnitと合わせる意味でpom.xmlに以下を追加して、mvn testでもシステムクラスローダーを利用するように設定した。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <useSystemClassLoader>true</useSystemClassLoader>
  </configuration>
</plugin>

追記後、mvn testを実行してみると成功した。一応解決したが、イマイチ意味が分からないためモヤモヤ。surefireのクラスローダーは上手くメッセージリソースを読み込めなかったってことなのかな?ここは本格的に調査してみないと。