m-miyawaki-m / junitSample

0 stars 0 forks source link

コントローラー #2

Open m-miyawaki-m opened 6 days ago

m-miyawaki-m commented 6 days ago

@PostMapping に path や consumes を指定したメソッドに対してテストを行う際、特に @RequestPart でファイルを扱い、@W2UIFormRequest(SAVE) のようなカスタムアノテーションや Date の引数がある場合のテスト方法について説明します。

この例では、Spring MVC の MockMvc を使って multipart/form-data のリクエストをシミュレートし、ファイルアップロードと @RequestPart や @RequestDate などの引数を適切にテストします。

メソッドの解釈

まず、あなたの提示されたメソッドの役割を確認します。

@PostMapping(path="app/ia/acc/up", consumes={"multipart/form-data"}) @W2UIFormResponse(SAVE) public Result update( @W2UIFormRequest(SAVE) Info form, @RequestPart(name="files", required=true) List files, @RequestDate Date opdate ) { // ロジック }

@PostMapping: app/ia/acc/up のパスで、multipart/form-data のコンテンツタイプを持つPOSTリクエストを処理します。

@W2UIFormRequest(SAVE): カスタムアノテーション(Info オブジェクトをリクエストから取得するために使用されています)。

@RequestPart: マルチパートリクエストの一部であるファイルを取得します。

@RequestDate: カスタムアノテーションで、リクエストから Date データを取得します。

テスト方法

  1. MockMultipartFile を使ってファイルデータをシミュレートします。

  2. ObjectMapper を使ってフォームデータをJSON形式でシミュレートします。

  3. MockMvc の multipart() メソッドを使用して、multipart/form-data のリクエストを送信します。

  4. 依存関係の確認 (pom.xml)

JUnit 4、Spring Test、Mockito などの依存関係が必要です。

org.springframework spring-test 5.3.39 test junit junit 4.13.2 test org.mockito mockito-core 3.12.4 test com.fasterxml.jackson.core jackson-databind 2.12.5 test
  1. テストクラスの作成

テストでは、ファイルやフォームデータ、日付の部分をシミュレートし、メソッドの動作を確認します。

import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import java.text.SimpleDateFormat; import java.util.Date; import java.util.List;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(MockitoJUnitRunner.class) public class UpdateControllerTest {

private MockMvc mockMvc;

@InjectMocks
private UpdateController updateController;

private ObjectMapper objectMapper = new ObjectMapper();  // JSONシリアライズ用

@Before
public void setup() {
    mockMvc = MockMvcBuilders.standaloneSetup(updateController).build();
}

@Test
public void testUpdate() throws Exception {
    // InfoオブジェクトのJSON形式をシミュレート
    Info form = new Info();
    form.setName("Test Name");
    form.setAge(30);
    String formJson = objectMapper.writeValueAsString(form);

    // マルチパートのファイルを作成
    MockMultipartFile mockFile1 = new MockMultipartFile("files", "file1.txt", "text/plain", "file content 1".getBytes());
    MockMultipartFile mockFile2 = new MockMultipartFile("files", "file2.txt", "text/plain", "file content 2".getBytes());

    // 日付をフォーマット
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    String opdate = dateFormat.format(new Date());

    // マルチパートリクエストの実行
    mockMvc.perform(multipart("/app/ia/acc/up")
            .file(mockFile1)
            .file(mockFile2)
            .param("opdate", opdate)  // 日付パラメータ
            .param("form", formJson)  // フォームデータ
            .contentType("multipart/form-data"))
            .andExpect(status().isOk());  // 成功ステータスを期待
}

}

  1. テストのポイント

MockMultipartFile: ファイルアップロードをシミュレートするために使用します。ファイルは @RequestPart で受け取るため、テストでも MockMultipartFile を使ってマルチパートリクエストを作成します。

ObjectMapper: Info オブジェクトをJSON形式に変換します。@W2UIFormRequest で扱われるデータがJSONであることを前提にしています。

multipart(): MockMvc の multipart() メソッドを使用して、multipart/form-data のリクエストを送信します。file() メソッドでファイルを追加し、param() メソッドで他のパラメータを送信します。

param(): 日付データ (@RequestDate) やフォームデータ (@W2UIFormRequest) は param() メソッドを使用してリクエストパラメータとして送信します。日付データは通常 yyyy-MM-dd フォーマットなどで送信します。

まとめ

このテストでは、Springの MockMvc と MockMultipartFile を使って、マルチパートリクエストをシミュレートし、ファイルアップロード、フォームデータのJSON、そして日付データの処理を確認します。

ファイルアップロードは MockMultipartFile を使用してシミュレート。

フォームデータは ObjectMapper を使用してJSON形式にシリアライズ。

日付データは SimpleDateFormat で正しいフォーマットに変換し、リクエストパラメータとして送信。

この方法を使えば、multipart/form-data を扱うメソッドを効率的にテストできます。