本番環境で動作している既存の Spring 2.5 コードベースに自動テストを追加しています。コントローラーで onSubmit() メソッドをテストしようとしています。
これは、コントローラーのビューの XML 構成です。
<property name="formView" value="createPublicBroadcastsForm" />
<property name="successView" value="redirect:createBroadcastsResults.htm" />
これが私のJUnitテストです:
@Before
public void setup() {
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
}
@Test
public void displayForm() throws Exception {
ModelAndView mv = controller.handleRequest(request, response);
assertViewName(mv, controller.getFormView());
}
@Test
public void testSubmitCreate() throws Exception {
request.setMethod("POST");
request.addParameter("title", "qwerty");
request.addParameter("startDate", "02/22/2013 09:00 AM");
request.addParameter("hours", "1");
request.addParameter("minutes", "1");
request.addParameter("seconds", "1");
request.addParameter("repeats", "None");
ModelAndView mv;
try {
mv = controller.handleRequest(request, response);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
assertViewName(mv, controller.getSuccessView());
}
displayForm() のアサーションは成功しますが、testSubmitCreate() のアサーションは失敗します。これは、ModelAndView のビュー名が「redirect:createBroadcastsResults.htm」ではなく「createPublicBroadcastsForm」であるためです。
私が見たいくつかのことは、controller.handleRequest() が例外をスローしないこと、コントローラーの onSubmit() メソッドが呼び出されないこと、および isFormSubmission() のオーバーライドを行って、super を呼び出した後に値を出力することです。 .isFormSubmission() であり、true を返します。
また、handleRequest() の代わりにコントローラの onSubmit() を直接呼び出すようにテストを変更すると、テストはパスします。
PublicBroadcastCommand command = new PublicBroadcastCommand();
command.setTitle("qwerty");
command.setStartDate(DateUtils.createDate(2013, 2, 22, 9));
command.setHours(1);
command.setMinutes(1);
command.setSeconds(1);
command.setRepeats("None");
ModelAndView mv = controller.onSubmit(request, response, command, null);
assertViewName(mv, controller.getSuccessView());
それで、handleRequest() または onSubmit() (または両方、onSubmit() は単体テスト、handleRequest() は統合テスト) を呼び出してコントローラーをテストする必要があるかどうか疑問に思っています。そして、handleRequest() を呼び出してテストしようとすると、どこが間違っているのかについて何か考えはありますか?