Фон
У меня есть простое приложение SpringBoot, в котором я тестирую ОБНОВЛЕНИЕ моего объекта домена из DTO. Естественно - я использую ModelMapper для преобразования из DTO- ›Entity. Проблема, с которой я сталкиваюсь, заключается в том, что, хотя ModelMapper отлично работает в режиме реального времени, он не работает во время JUNIT. Я помещаю точку останова в initBaseModelMapper
в моем файле конфигурации во время выполнения как JUNIT, так и LIVE, и точка останова успешно срабатывает. Но в JUNITS во время фактического сопоставления - значения null
все еще применяются к объекту домена, но не во время динамического запуска, который работает идеально.
Конфигурация
@Configuration
public class ModelMapperConfiguration {
@Bean(name = "myEntityMapper")
public ModelMapper modelMapper() {
return initBaseModelMapper();
}
public static ModelMapper initBaseModelMapper() {
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setPropertyCondition(Conditions.isNotNull());
modelMapper.getConfiguration().setSkipNullEnabled(true); // Tried without this as well
return modelMapper; // Gets hit during LIVE and JUNITS
}
}
Тестируемый метод основного класса
public class MyCaseService {
@Autowired
@Qualifier("myEntityMapper")
private ModelMapper modelMapper;
@Override
@Transactional
public @ResponseBody
MyCaseEntity updateMyCase(
@Valid final String myCaseId,
@Valid MyCaseDTO myCase) throws Exception {
MyCaseEntity existingEntity = entityRepository.find(myCaseId);
modelMapper.map(myCase, existingEntity);
return existingEntity;
}
ИЮНЬ
Я поставил точку останова на ModelConfiguration
и вижу, как он инициализируется точно так же, как когда код работает в реальном времени. Однако по какой-то причине ModelMapper ИГНОРИРУЕТ пропуск нулевых полей, в отличие от того, когда он работает в реальном времени.
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes= {ModelMapperConfiguration.class})
public class MyCaseServiceTest {
@InjectMocks
private MyCaseService testSubject;
@Spy
@Qualifier("myEntityMapper")
private ModelMapper modelMapper;
@Before
public void setUp() {
// Initialized `testEntityCase` etc with Id etc
}
@Test
public void testUpdate() throws Exception {
Mockito.when(entityRepository.find(Mockito.any())).thenReturn(testEntityCase);
MyCaseEntity myCase = testSubject.updateMyCase(
"1",
testCaseDTO);
assertEquals(1L, myCase.getId().longValue()); // <- Test Fails with NullPointer. Id becomes null during JUNIT.
}
ContextConfiguration
, который я предоставляю в тестовом классе? Также без Spy не будет работать, поскольку ModelMapper не будет вводиться вMyCaseService testSubject
- person Dorian McAllister   schedule 25.11.2020@Spy
создает новый неинициализированный ModelMapper, который впоследствии будет автоматически подключен, для этого и нужны шпионы. Похоже, что ваша конфигурация не создает Службу, поэтому нет автоматического подключения, просто насмешки / шпионы вводятся через@InjectMocks
- person Turo   schedule 25.11.2020