LoginSignup
10
10

More than 3 years have passed since last update.

テスト対象のクラスの一部のメソッドをモック化する方法

Posted at

最近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化するのはよくやるからいいんだけど、テスト対象の一部をモック化するのはたまにしか出てこないから忘れるんですよね。。
というか、クラス分けたほうがいいって話が多数で(そうなんだけど、そこまでするまでもないロジックだったりするし)

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10