#java #unit-testing #spring-data-jpa #mockito #junit5
#java #модульное тестирование #spring-data-jpa #mockito #junit5
Вопрос:
Я не могу сохранить объекты после внесения изменений.
Я устанавливаю атрибуты объекта в новые значения, когда я хочу сохранить, я получаю NullPointerException
.
/* The method to be tested */
public Rem afterInitRem(Rem rem) {
/** Initialize regles with status MISSING **/
List<Regle> regles = rem.getRegles();
Regle regle = new Regle();
regle.setCode("REGLE1");
regle.setStatus(RegleStatus.MISSING);
regles.add(regle);
return remRepository.save(rem);
}
/*The test*/
@Mock
private RemRepository remRepository;
@BeforeEach
void beforeEachTest() {
rem = new Rem();
}
@AfterEach
void reInitVar() {
beforeEachTest();
}
@Test
public void afterInitRemTest() {
target.afterInitrem(rem);
when(remRepository.save(any(Rem.class))).thenReturn(rem);
ArgumentCaptor<Rem> argument = ArgumentCaptor.forClass(Rem.class);
verify(regleRepository).save(argument.capture());
assertEquals("REGLE1", argument.getValue().getRegles().get(0).getCode());
assertEquals(RegleStatus.MISSING, argument.getValue().getRegles().get(0).getStatus());
assertEquals(1, argument.getValue().getRegles().size());
}
Я проводил отладку и увидел, что атрибуты были установлены, проблема в return remRepository.save(rem);
Комментарии:
1. Пожалуйста, придерживайтесь английского языка. Stackoverflow доступен только на английском языке
Ответ №1:
Поскольку вы используете Junit5, убедитесь, что в вашем коде есть любой из них для инициализации макетов:
@ExtendWith(MockitoExtension.class) on the test class
или
@BeforeEach
void beforeEachTest() {
MockitoAnnotations.initMocks(this);
rem = new Rem();
}
Кроме того, вам нужно убедиться, что вы внедрили свой макет вручную или с помощью @InjectMocks
аннотации в SUT.
И, наконец, убедитесь, что вы выполнили все макетные настройки перед вызовом фактического метода SUT.
Комментарии:
1. У меня есть @ExtendWith(MockitoExtension.class ) в тестовом классе
2. Хорошо, вы проверили мои другие советы?
3. Здравствуйте, для руководства по вводу макета это не «@Mock private RemRepository remRepository; » ?
4. Нет, это создает макет, но не вводит его