starzware

ITスキル

spring bootでテスト

TIPS
Mockitoを使う

//[@InjectMocks]で[@Autowired]しているものをすべて定義する
@Mock
private Service service;

//テスト対象への注入する
@InjectMocks
private Controller controller;

//戻り値ありの場合
Mockito.when(モックインスタンス).メソッド(任意の引数).thenReturn(任意の戻り値);

//戻り値のないメソッドの場合
Mockito.doNothing().when(モックインスタンス).メソッド(任意の引数);
ObjectMapperでJSONからList<Map>を作る

List<Map<String, Object>> map = objectMapper.readValue(jsonString, new TypeReference<ArrayList<HashMap<String, Object>>>() {});
MvcMockでアクセス

@AutoConfigureMockMvc
// Get
MvcResult result = mockMvc.perform(MockMvcRequestBuilders
  .get("/user")
  .accept(MediaType.APPLICATION_JSON)
  .param("key", value)
).andReturn();
// Post
MvcResult result = mockMvc.perform(MockMvcRequestBuilders
  .post("/user/entry")
  .content(objectMapper.writeValueAsString(requestData))
  .contentType(MediaType.APPLICATION_JSON_VALUE)
).andReturn();
// FileUpload
MultiValueMap params = new LinkedMultiValueMap();
params.add("key", "value");
Path path = ...
byte[] data = Files.readAllBytes(path); // java.nio.file.Files
// new MockMultipartFile(キー名,オリジナルファイル名,content-type,データ)
MockMultipartFile firstFile = new MockMultipartFile("uploadFile", "filename.txt", "text/plain", data);
MvcResult result = mockMvc.perform(MockMvcRequestBuilders
  .multipart("/user/upload")
  .file(firstFile)
  .params(params)
).andReturn();

// performで[.andExpect(status().isOk())]すればいいけど
assertEquals(HttpStatus.OK, result.getResponse().getStatus());
[Mock]返却値を変える

// n回呼ばれる場合で、それぞれ戻り値を変える場合
when(モック化したオブジェクト.メソッド).thenReturn("1回目の値", "2回目の値", "3回目の値"); //4回目以降は3回目の値となる
// メソッドチェインで記載してもOK
when(モック化したオブジェクト.メソッド)
.thenReturn("1回目の値") 
.thenReturn("2回目の値") 
.thenReturn("3回目の値");
DBUnitを利用してデータを投入する

// データベース設定に注意(消えるよ)
// src/test/resources/application.properties or ymlのデータベース設定に投入(なければsrc/main/resourcesの設定)
// ファイル名だけなら同じパッケージ(resources側)に置く
// シート名=テーブル名
//   シートを準備してシートの中身をなし(何も書かない)とテーブルデータが消えるだけ
@Test
@DatabaseSetup("test01_input.xlsx")
DBUnitを利用して結果を検証する

//NON_STRICTを指定して記載されているテーブルのみが検査するようにする
//NON_STRICT_UNORDEREDを指定すると行の順番を無視する
// ファイル名だけなら同じパッケージ(resources側)に置く
@Test
@ExpectedDatabase(value="test01_after.xlsx",assertionMode=DatabaseAssertionMode.NON_STRICT_UNORDERED)
jsonに変換

Map map = newHashMap();
map.put("key1", value);
String json = objectMapping.writeValueAsString(map);
DBUnitでExcelファイルをロードする

//テストクラスに以下のアノテーションを付与
//@DbUnitConfiguration(dataSetLoader = XlsDataSetLoader.class)
//以下のクラスを作成
public class XlsDataSetLoader extends AbstractDataSetLoader {
    @Override
    protected IDataSet createDataSet(Resource resource) throws Exception {
        try(InputStream inputStream = resource.getInputStream()) {
            //return new XlsDataSet(inputStream);
            XlsDataSet xlsDataSet = new XlsDataSet(inputStream);
            ReplacementDataset replacementDataSet = new ReplacementDataset(xlsDataSet);
            replacementDataSet.addReplacementObject("%NULL%", null);
            return replacementDataSet;
        }
    }
}
[DBUnit]DataSet

// CompsiteDataSet beforeDataSet + insertedDataSet
CompositeDataSet joinDataSet = new CompositeDataSet(beforeDataSet,insertedDataSet);
// ReplacementDataSet
ReplacementDataSet replaceDataSet = new ReplacementDataSet(dataset);
replaceDataSet.addReplacementObject("xxxx", value); //xxxxをvalueに置き換え
// QueryDataSet
QueryDataSet queryDataSet = new QueryDataSet(new DatabaseConnection(conn));
// 
String[] tables = new String[]{"table_a", "table_b", "table_c"};
IDataSet choiceDataSet = new DatabaseConnection(conn).createDataSet(tables);
いろいろ

// Resourcesフォルダのファイル内容を文字列にロードする
// Apache Common のIOUtilsを使用
String json = IOUtils.toString(getClass().getResourceAsStream("ファイル"), Charset.defaultCharset());