В настоящее время я предоставляю покрытие - проверяю проверку моего DTO с помощью запроса вызова MockMVC.Я недавно ввел новое поле в ConstraintValidator для регистрации, SupportSpecializations, из которого я вставляю значения из application.properties для простоты обслуживания и расширения.см. фрагмент кода ниже:
@Component
public class RegistrationValidator implements ConstraintValidator<Registration, String> {
//campus.students.supportedspecializations="J2E,.NET,OracleDB,MySQL,Angular"
@Value("${campus.students.supportedspecializations}")
private String supportedSpecializations;
private String specializationExceptionMessage;
//All ExceptionMessages are maintained in a separate class
@Override
public void initialize(Registration constraintAnnotation) {
exceptionMessage = constraintAnnotation.regionException().getMessage();
}
@Override
public boolean isValid(RegistrationData regData, ConstraintValidatorContext context) {
String[] specializations = supportedSpecializations.split(",");
boolean isValidSpecialization = Arrays.stream(specializations)
.anyMatch(spec -> spec.equalsIgnoreCase(regData.getSpec()));
if (!isValidSpecialization){
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(specializationExceptionMessage)
.addConstraintViolation();
return false;
}
//additional validation logic...
return true;
}
}
Модульные тесты теперь не выполняются из-за того, что поле не введено определенным свойством аннотации @Value.Я не уверен, что ReflectionTestUtils может помочь в моем случае, поэтому любые предложения о том, как ввести требуемые значения в UnitTests, очень ценятся.
Версия Spring - 2.1.0В настоящее время я тестирую с использованием следующего фрагмента:
@InjectMocks
private StudentController mockRestController;
@Mock
private StudentService mockStudentService;
@Mock
private ValidationExceptionTranslator mockExceptionTranslator;
@Value("${campus.students.supportedspecializations}")
private String supportedSpecializations;
private MockMvc mockMvc;
private static final String VALIDATION_SUCCESSFUL = "success";
private static final String VALIDATION_FAILED = "failed";
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(mockRestController).build();
doReturn(
ResponseEntity.status(HttpStatus.OK)
.header("Content-Type", "text/html; charset=utf-8")
.body(VALIDATION_SUCCESSFUL))
.when(mockStudentService).insertStudent(Mockito.any());
doReturn(
ResponseEntity.status(HttpStatus.BAD_REQUEST)
.header("Content-Type", "application/json")
.body(VALIDATION_FAILED))
.when(mockExceptionTranslator).translate(Mockito.any());
}
@Test
public void testValidation_UnsupportedSpecialization() throws Exception {
MvcResult mvcResult = mockMvc.perform(
post("/Students").contentType(MediaType.APPLICATION_JSON_UTF8).content(
"{\"registrationData\":{\"spec\":\"unsupported\"}}"))
.andExpect(status().isBadRequest())
.andReturn();
assertEquals(VALIDATION_FAILED, mvcResult.getResponse().getContentAsString());
verify(mockExceptionTranslator, times(1)).translate(Mockito.any());
verify(mockStudentService, times(0)).insertStudent(Mockito.any());
}
Я пытался пометить свой класс Test с помощью @ RunWith (SpringRunner.class) и @ SpringBootTest (классы= Application.class) , но проверка по-прежнему не проходит из-за того, что @Value не разрешается.Я могу ошибаться, но я думаю, что экземпляр ConstraintValidator создается до того, как мы достигнем restController, поэтому вызов MockMVC execute (...) не может просто убедиться, что соответствующее значение @Value в валидаторе вставленов поддерживаемые специализации.