概要
現在SpringBootのテストコードの勉強中です。
私の実力不足によりテストコードはとても難しく試行錯誤している状態です。
mockitoを使うのですが
mockitoについて公式ドキュメントを読んでも全く理解できませんでした…
この現状を打開すべく、Udemyで講座を受けました。
私は現状なんとなくしか理解してないです。大まかな感じが伝われば幸いです。
正確な情報は公式Documentと講座の方で確認お願い致します。
受けた講座について
Testing Spring Boot: Beginner to Guru
講師名:John Thompson氏
Section9:Getting Started with Mockito
音声、字幕共に英語です。理解に時間は掛かりますが情報量が多く満足しています。
SpringBootのテスト手法を幅広く扱っています。総再生時間は17時間です。
junit5を触ったことがあるという方は必要なセクションから始めれば問題ないと私は考えます。
環境
IDE:InteliJのCommunity
githubのURL
習得した内容
テストする対象
JPAを使ってます。ServiceとRepositoryとSpringDataJPAのテストを行っています。
service/springdatajpa
public interface SpecialtyService extends CrudService<Speciality, Long> {
}
service/map
public class SpecialityMapService extends AbstractMapService<Speciality, Long> implements SpecialtyService {
@Override
public void deleteById(Long id) {
super.deleteById(id);
}
}
repositories
public interface SpecialtyRepository extends CrudRepository<Speciality, Long> {
}
service/springdatajpa
public class SpecialitySDJpaService implements SpecialtyService {
private final SpecialtyRepository specialtyRepository;
public SpecialitySDJpaService(SpecialtyRepository specialtyRepository) {
this.specialtyRepository = specialtyRepository;
}
@Override
public void deleteById(Long aLong) {
specialtyRepository.deleteById(aLong);
}
}
@Mock と @injectMock
branchは inject-mock
@ExtendWith(MockitoExtension.class)
class SpecialitySDJpaServiceTest {
@Mock
SpecialtyRepository specialtyRepository;
@InjectMocks
SpecialitySDJpaService service;
@Test
void deleteById() {
service.deleteById(1l);
}
@Test
void testDelete() {
service.delete(new Speciality());
}
}
SpecialitySDJpaServiceにブレークポイントを打ってデバッグを実行します。
デバッグ実行後serviceの中にrepositoryの値が入っていることを確認できます。
verify
branchは「verify」
verifyを使ってインスタンスの呼び出し回数のテストを行います。
色々種類ありますが、timeについて紹介します。
timeは指定したインスタンスの呼び出し回数についてテストをします。
@ExtendWith(MockitoExtension.class)
class SpecialitySDJpaServiceTest {
@Mock
SpecialtyRepository specialtyRepository;
@InjectMocks
SpecialitySDJpaService service;
@Test
void deleteById() {
service.deleteById(1l);
service.deleteById(1l);
verify(specialtyRepository, times(1)).deleteById(1l);
}
}
time(1)の値をtime(2)などにして変更し実行するとエラーになります。
when
branchは「return-val-form-mock」
@ExtendWith(MockitoExtension.class)
class SpecialitySDJpaServiceTest {
@Mock
SpecialtyRepository specialtyRepository;
@InjectMocks
SpecialitySDJpaService service;
@Test
void findByIdTest() {
Speciality speciality = new Speciality();
Speciality tmp = new Speciality();
when(specialtyRepository.findById(1L)).thenReturn(Optional.of(speciality));
System.out.println(when(specialtyRepository.findById(1L)).thenReturn(Optional.of(speciality)));
Speciality foundSpecialty = service.findById(1L);
assertThat(foundSpecialty).isNotNull();
System.out.println(specialtyRepository.findById(1L));
System.out.println(specialtyRepository.findById(2L)); //入ってない
}
}
Spcialityクラスが紐付けられていることが確認できます。
1Lは値が入ってますが、
2Lの方は値が入っていません。
引数を指定する役割があると思われます。
まとめ
デバッグの仕方とか勉強になりました。
whenは今まで使っていませんでした勉強になります。
次に取り組むこと
Section10:Behavior Driven Mockito