Spring Framework — Макет не издевается

#java #spring #spring-mvc #junit #mockito

#java #весна #spring-mvc #junit #mockito

Вопрос:

У меня есть приложение Spring MvC. (Spring Framework — это платформа приложения и инверсия контейнера управления для платформы Java) с помощью этого теста:

     @RunWith(SpringJUnit4ClassRunner.class)
    public class AutorisationServiceTest {
    
        @Autowired
        @InjectMocks
        private IAutorisationService service;
    
        @Mock
        PersonneRepository personneRepository = Mockito.mock(PersonneRepository.class);
    
    
        @Before
        public void setup() {
        }
    
    
        @Test
        public void should_Find_GardeWith2Affectations() throws IOException {
    
            when(personneRepository.getAll(anyString())).thenReturn(DataLoader.mockData());
            service.getAll("rules");
        }
    
    }

    @Service
    public class AutorisationService implements IAutorisationService {
    
        private final PersonneRepository personneRepository;
    
        public AutorisationService(PersonneRepository personneRepository) {
            this.personneRepository = personneRepository;
        }

@Override
    public List<User> getAll(String where) {
        return personneRepository.getAll(where));
    }
    ...
    }
  

но когда я запускаю тест, кажется, что он не издевается над репозиторием

Комментарии:

1. Какой junit вы используете. Junit4 или Junit5? Можете ли вы показать код с импортом?

2. Я использую 4.13

3. Вы издеваетесь над конечным объектом. Издевательство над конечным объектом обычно возвращает мне значение null. Можете ли вы попробовать изменить его из final.

Ответ №1:

Вы должны решить, хотите ли вы написать тест Spring или тест Mockito.

Весенний тест загрузит полный контекст, и затем вы сможете работать с @Autowired и @MockBean:

 @RunWith(SpringJUnit4ClassRunner.class)
public class AutorisationServiceTest {
    
  @Autowired
  private IAutorisationService service;
    
  @MockBean
  PersonneRepository personneRepository;
  

Тест Mockito выполняется намного быстрее, но у вас будут только те объекты, которые вы явно настроили с помощью @InjectMocks или @Mock:

 @RunWith(MockitoJUnitRunner.class)
public class AutorisationServiceTest {
  
  @InjectMocks
  private IAutorisationService service;
    
  @Mock
  PersonneRepository personneRepository;
  

Обратите внимание, что вам никогда не придется создавать макет с помощью Mockito.mock() при использовании аннотаций и специализированных бегунов.

Я предполагаю, что ваш PersonneRepository — это @Service, @Component или @Repository. Поэтому здесь также следует использовать автоматическую проводку:

 @Service
public class AutorisationService implements IAutorisationService {

   @Autowired    
   private PersonneRepository personneRepository;
  

Ответ №2:

Этот ответ предназначен для testng:

MockitoTestExecutionListener инициализирует mocks, и вам нужно использовать @MockBean аннотацию.

 @RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners(MockitoTestExecutionListener.class)
public class AutorisationServiceTest {   
    @MockBean
    PersonneRepository personneRepository;
  

Кроме того, не забудьте добавить ResetMocksTestExecutionListener , чтобы предотвратить постоянные насмешки между тестами (см. Этот выпуск).

Ответ №3:

Вы не можете использовать оба @Mock и Mockito.mock . Выберите один из них

Комментарии:

1. Я удалил Mockito.mock(PersonneRepository.class ), но потом я получил нулевой указатель

2. Можете ли вы запустить службу без аннотации Autowire?

Ответ №4:

В методе установки @Before вам нужно добавить MockitoAnnotations.initMocks(this). Это приведет к внедрению ваших поддельных сервисов. Я изменил приведенный ниже код :

 @RunWith(SpringJUnit4ClassRunner.class)
    public class AutorisationServiceTest {
    
        @Mock
        PersonneRepository personneRepository;

        @InjectMocks
        private AutorisationService service;
    
        @Before
        public void setup() {
          MockitoAnnotations.initMocks(this);
        }
    
    
        @Test
        public void should_Find_GardeWith2Affectations() throws IOException {
    
            when(personneRepository.getAll(anyString())).thenReturn(DataLoader.mockData());
            service.getAll("rules");
        }
    
    }

    @Service
    public class AutorisationService implements IAutorisationService {
    
        private final PersonneRepository personneRepository;
    
        public AutorisationService(PersonneRepository personneRepository) {
            this.personneRepository = personneRepository;
        }

@Override
    public List<User> getAll(String where) {
        return personneRepository.getAll(where));
    }
    ...
    }