#java #spring #junit #mockito #eclipselink
Вопрос:
У меня есть этот урок:
@Repository
public interface EnfantRepository extends JpaRepository<Enfant, Long> {
..
}
и эта услуга:
@Transactional
@Service
@Slf4j
public class EnfantService implements IEnfantService {
public Enfant save (Enfant enfant) {
return enfantRepository.save(enfant);
}
}
и этот тест:
@RunWith(MockitoJUnitRunner.class)
public class EnfantServiceTest {
@Mock
private EnfantRepository enfantRepository = mock(EnfantRepository.class);
@InjectMocks
private EnfantService enfantService;
@Test
public void testSave() {
System.out.println(enfantService.save(Enfant.builder().build()));
Assertions.assertThat
(enfantService.save(Enfant.builder().build())).isNotNull();
}
}
но он возвращает значение null после сохранения, и тест завершается неудачно
Ответ №1:
Здесь, в классе EnfantServiceTest, вы издевались над классом EnfantRepository, и внутри этого издевательского класса EnfantRepository не предусмотрена реализация метода. Таким образом, вызов любого метода вернет значение null.
Здесь есть два пути:
- Заглушка для метода сохранения для вашего издевательского класса EnfantRepository, использующего «когда» и «тогда» Mockito.
@RunWith(MockitoJUnitRunner.class)
public class EnfantServiceTest {
@Mock
private EnfantRepository enfantRepository = mock(EnfantRepository.class);
@InjectMocks
private EnfantService enfantService;
@Test
public void testSave() {
System.out.println(enfantService.save(Enfant.builder().build()));
when(enfantRepository.save(any()).thenReturn(Long.of(1));
Assertions.assertThat
(enfantService.save(Enfant.builder().build())).isNotNull();
}
}
But this wont be a good way of testing the repository code. Rather,
- Используйте базу данных в памяти, как
H2
для вашей тестовой среды, и в этом случае не нужно издеваться над классом репозитория.
Во время выполнения тестов Spring вызовет базу данных H2, а затем подключится к этой базе данных, создаст таблицы из вашего класса сущностей и выполнит все запросы к этой базе данных. Это гарантирует, что ваш код будет работать так, как ожидалось, от конца до конца.