тест, возвращающий значение NULL при сохранении

#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.

Здесь есть два пути:

  1. Заглушка для метода сохранения для вашего издевательского класса 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,
 
  1. Используйте базу данных в памяти, как H2 для вашей тестовой среды, и в этом случае не нужно издеваться над классом репозитория.
    Во время выполнения тестов Spring вызовет базу данных H2, а затем подключится к этой базе данных, создаст таблицы из вашего класса сущностей и выполнит все запросы к этой базе данных. Это гарантирует, что ваш код будет работать так, как ожидалось, от конца до конца.