複数のファイルをアップロードするためのスプリング コントローラーをテストしようとしています。コントローラーは次のとおりです。
@RequestMapping("/vocabularys")
@Controller
public class VocabularyController {
...
テストしたいアクション:
@RequestMapping(value = "/import", method = {RequestMethod.PUT, RequestMethod.POST})
@ResponseBody
@CacheEvict(value="vocabulary", allEntries=true)
public Object importVocabulary(MultipartHttpServletRequest request, HttpServletResponse response) {
...
webmvc-config.xml にあるリゾルバー:
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"/>
コードは問題なく動作します。これを単体/統合テストしようとすると、問題が発生します。
テストでの私の試みは次のとおりです。
public class VocabularyControllerTest extends BaseControllerTest {
static final private String AdminUsername = "administrator";
@Test
public void shouldBeAbleToUploadAFile() throws Exception {
createTestWorkspace();
login(AdminUsername, "*");
MockMultipartFile file = new MockMultipartFile("test_vocab.xml", new FileInputStream("src/test/files/acme_vocabulary.xml"));
MockMultipartHttpServletRequestBuilder mockMultipartHttpServletRequestBuilder = (MockMultipartHttpServletRequestBuilder) fileUpload("/vocabularys/import").accept(MediaType.ALL).session(httpSession);
mockMultipartHttpServletRequestBuilder.file(file);
mockMultipartHttpServletRequestBuilder.content("whatever");
ResultActions resultActions = mockMvc.perform(mockMultipartHttpServletRequestBuilder);
resultActions.andExpect(status().isFound());
}
}
createWorkspace()
andなどは無視してlogin()
ください。これらは、セキュリティ フィルターを通過するためのものです。
の関連部分BaseControllerTest
:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextHierarchy({
@ContextConfiguration(locations = {
"file:src/test/resources/META-INF/spring/applicationContext.xml",
"file:src/test/resources/META-INF/spring/applicationContext-security.xml",
"file:src/main/resources/META-INF/spring/applicationContext-database.xml",
"file:src/main/resources/META-INF/spring/applicationContext-activiti.xml",
"file:src/main/resources/META-INF/spring/applicationContext-cache.xml",
"file:src/main/resources/META-INF/spring/applicationContext-jms.xml",
"file:src/main/resources/META-INF/spring/applicationContext-mail.xml",
"file:src/main/resources/META-INF/spring/applicationContext-mongo.xml"}),
@ContextConfiguration(locations = {
"file:src/main/webapp/WEB-INF/spring/webmvc-config.xml",
"file:src/test/webapp/WEB-INF/spring/applicationContext-filters.xml"})
})
@Transactional
public class BaseControllerTest extends BaseTest {
@Autowired
WebApplicationContext wac;
@Autowired
MockHttpSession httpSession;
@Autowired
MockServletContext servletContext;
@Autowired
OpenEntityManagerInViewFilter openEntityManagerInViewFilter;
@Autowired
HiddenHttpMethodFilter hiddenHttpMethodFilter;
@Autowired
CharacterEncodingFilter characterEncodingFilter;
@Autowired
SessionFilter sessionFilter;
@Autowired
WorkflowAsSessionFilter workflowAsSessionFilter;
@Autowired
FilterChainProxy springSecurityFilterChain;
@Autowired
RequestFilter requestFilter;
MockMvc mockMvc;
protected static final String TestFileDir = "src/test/files/";
@Before
public void setUp() throws Exception {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
.addFilter(openEntityManagerInViewFilter, "/*")
.addFilter(hiddenHttpMethodFilter, "/*")
.addFilter(characterEncodingFilter, "/*")
.addFilter(sessionFilter, "/*")
.addFilter(workflowAsSessionFilter, "/*")
.addFilter(springSecurityFilterChain, "/*")
.addFilter(requestFilter, "/*")
.build();
servletContext.setContextPath("/");
Session session = Session.findBySessionId(httpSession.getId());
if (session == null) {
session = new Session();
session.setJsessionid(httpSession.getId());
session.persist();
}
}
...
問題は、これをデバッグしようとするとperform
、オブジェクトに対するアクションがmockMvc
コントローラー メソッドにヒットしないことです。セキュリティ フィルターを通過するのが問題だと思っていましたが (これが と をすべて持っている理由login
です)、ボキャブラリ コントローラーで他のアクションをテストしたところ、問題なくヒットすることができました。
考え?アイデア?提案?