最近noteに書くか、Qiitaに書くか迷い中です。
いつも忘れる、いつも一部をモック化したいときの書き方。
- mock化したいメソッド
@Slf4j
@Service
public class HighHolidayService {
// 一月単位でまとめた休日リスト
Map<String, List<LocalDate>> highHolidayCache = new HashMap<>();
// テスト対象のメソッド
public List<LocalDate> getHolidayList(LocalDate targetDate) {
String key = String.format("%d%02d", targetDate.getYear(), targetDate.getMonthValue());
if (highHolidayCache.containsKey(key)) {
return highHolidayCache.get(key);
}
List<LocalDate> holidayList = selectRecords(targetDate);
highHolidayCache.put(key, holidayList);
return holidayList;
}
// このメソッドをモック化したい!!!!
List<LocalDate> selectRecords(LocalDate targetDate) {
return null;
}
}
- テストの書き方
package jp.co.hogehoge.service;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.doReturn;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
import org.springframework.boot.test.mock.mockito.SpyBean;
public class HighHolidayServiceTest {
@SpyBean // springboot の@spyの書き方
HighHolidayService highHolidayService;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Test
public void 対象の休日リストを取得する() {
List<LocalDate> returnHolidayList = new ArrayList<>();
returnHolidayList.add(LocalDate.of(2019, 07, 28));
returnHolidayList.add(LocalDate.of(2019, 07, 21));
returnHolidayList.add(LocalDate.of(2019, 07, 15));
returnHolidayList.add(LocalDate.of(2019, 07, 14));
returnHolidayList.add(LocalDate.of(2019, 07, 7));
// doReturn(返却するオブジェクト).when(spyしたオブジェクト).method()
// この書き方忘れる!!
doReturn(returnHolidayList).when(highHolidayService).selectRecords(anyObject());
LocalDate date = LocalDate.of(2019, 7, 15);
List<LocalDate> holidayList = highHolidayService.getHolidayList(date);
holidayList.forEach(System.out::println);
}
}
クラスごとMock化するのはよくやるからいいんだけど、テスト対象の一部をモック化するのはたまにしか出てこないから忘れるんですよね。。
というか、クラス分けたほうがいいって話が多数で(そうなんだけど、そこまでするまでもないロジックだったりするし)