1

実際のアプリケーションでは、 maxUploadSizeパラメータorg.springframework.web.multipart.commons.CommonsMultipartResolverを定義する場所を使用しています。そこで、Spring mvc test を使ってキャッチをテストしたいと思います。MaxUploadSizeExceededException

このために、私はorg.springframework.web.multipart.support.MultipartFilterJavaで追加しています:

@Autowired
private WebApplicationContext wac;

@Autowired
private MultipartFilter multipartFilter;

private MockMvc mockMvc;

@Before
public void init() {
    mockMvc = MockMvcBuilders.webAppContextSetup(wac)
        .addFilter(multipartFilter).build();
}

テスト コンテキスト (xml ベースの構成):

<bean id="multipartFilter" class="org.springframework.web.multipart.support.MultipartFilter">
    <property name="multipartResolverBeanName" value="MyMultipartResolverBeanName" />
</bean>

MyMultipartResolverBeanName Bean は、maven-surefire-plugin を使用してテスト コンテキストに追加される実際のコンテキストで定義されます。

私のテストはチュートリアルのようなものです:

@Test(expected = MaxUploadSizeExceededException.class)
public void testCertSizeInvalid() throws Exception {
    mockMvc.perform(fileUpload(SUBMIT_URL)
        .file(new MockMultipartFile("fileName", new byte[MAX_UPLOAD_SIZE + 10]))
    );
}

実行中に発生する原因: org.apache.commons.fileupload.FileUploadException: マルチパート境界が見つからなかったため、リクエストが拒否されましorg.apache.commons.fileupload.FileUploadBase

私が理解しているように、実際のブラウザでは Content-Type ヘッダーに一意の境界を設定し、この境界で本文のパーツを分離しますが、スプリング モック テストはモック マルチパート リクエストを送信する際に境界を設定しません。

だから私は見つけた、ボディとコンテンツタイプヘッダーを修正する場所org.springframework.http.converter.FormHttpMessageConverterを作成し(境界付き)、リクエストビルダーにポストプロセッサーを追加します-テストに合格しました!.org.springframework.test.web.servlet.request.RequestPostProcessor

Content-Type ヘッダーとモック リクエストのボディに境界を追加するためのより良い、またはより簡単な方法を誰かが知っているのではないでしょうか?!

PS
より良い方法がない場合-ここに RequestPostProcessor を添付できます
使用バージョン:

  • 春テスト-3.2.0
  • commons-fileupload-1.2.2
4

1 に答える 1

1

MaxUploadSizeExceededException をテストするためのきれいな方法を見つけました

Mockito を使用して MultipartResolver をスパイし、強制的に例外をスローする必要があります。

  • 内側の @Configuration クラスを使用して、Mockito Spy であるマルチパート リゾルバーを配線します。
  • リゾルバーをクラスにオートワイヤーします
  • MaxUploadSizeExceededException テスト ケースの場合、リゾルバーをスタブして例外をスローし、コンテンツ タイプ MediaType.MULTIPART_FORM_DATA でポストを実行します。

これがコードです。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {SpringMVCConfiguration.class, UploadTest.TestConfiguration.class})
@SuppressWarnings("unchecked")
public final class UploadTest {

    public static final String MERCHANT_AUTH = "MERCHANT_AUTH";
    public static final String USER = "user";

    @Configuration
    public static class TestConfiguration {
        @Bean
        public MultipartResolver multipartResolver() {
            CommonsMultipartResolver resolver = new CommonsMultipartResolver();
            resolver.setMaxUploadSize(500 * 1028);
            return Mockito.spy(resolver);
        }
    }

    @Autowired
    private WebApplicationContext m_webApplicationContext;

    @Autowired
    private CommonsMultipartResolver m_multipartResolver;

    private MockMvc m_mockMvc;

    @Before
    public void setUp() throws Exception {
        m_mockMvc = MockMvcBuilders.webAppContextSetup(m_webApplicationContext).build();
    }

    @Test
    public void testName() throws Exception {
        Mockito.reset(m_multipartResolver);
    }

    @Test
    public void testUpload_FileTooLarge() throws Exception {

        /*
        Force multipart resolver to throw file too large exception
        */
        doThrow(new MaxUploadSizeExceededException(100)).when(m_multipartResolver).resolveMultipart(
            any(HttpServletRequest.class));

        /*
            Do a multipart post. Cannot use fileUpload as that skips calling the MultipartResolver
         */
        m_mockMvc.perform(post("/upload/")
                .contentType(MediaType.MULTIPART_FORM_DATA)
                .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isRequestEntityTooLarge())
            .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON));

    }
}    
于 2013-11-08T02:07:45.670 に答える