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のクラスローダーは上手くメッセージリソースを読み込めなかったってことなのかな?ここは本格的に調査してみないと。