#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));
}
...
}