我正在基于一个调用Spring Service的REST控制器构建SpringBoot CRUD应用程序。收到的POJO具有与验证相关的注释(包括自定义验证器),并且实际验证在服务内部触发(请参见下文)。
在SpringBoot执行中,一切工作都很好。
我现在需要为我的服务构建相关的 unit 测试用例,即,我 不想通过SpringBootRunner启动应用程序服务器。
下面是我的Patient类,带有与验证相关的注释。
@Data
@Entity
public class Patient {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotEmpty(message = "patient.name.mandatory")
private String name;
@Past(message = "patient.dateOfBirth.inThePast")
@NotNull(message = "patient.dateOfBirth.mandatory")
private Date dateOfBirth;
private boolean isEmergency;
// [...]
}
这是SpringBoot的REST控制器调用的服务。
@Service
@Validated
public class PatientService {
@Autowired
private PatientRepository repository;
@Autowired
private Validator validator;
public Patient create(Patient patient) {
if (! patient.isEmergency()) {
validator.validate(patient);
// then throw exception if validation failed
}
// [...]
}
}
这是我的JUnit测试。
@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
@Import(ModalityTestConfiguration.class)
public class PatientServiceTest {
@InjectMocks
private PatientService service;
@MockBean
private PatientRepository repository;
@Autowired
private Validator validator;
@Test
public void invalidEmptyPatientNoEmergency() {
Patient p = new Patient();
Patient result = null;
try {
result = service.create(p); // validations must fail -> exception
assert(false);
} catch (ConstraintViolationException e) {
// Execution should get here to verify that validations are OK
assert(result != null);
assert(e.getConstraintViolations() != null);
assert(e.getConstraintViolations().size() != 0);
// [...]
} catch (Exception e) {
assert(false);
}
}
以防万一,这里是REST控制器(我认为与JUnit测试无关)
@RestController
public class PatientController {
@Autowired
private PatientService patientService;
@PostMapping("/patients")
Patient createPatient(@RequestBody Patient patient) {
return (patientService.create(patient));
}
我的问题是我的服务中的验证程序始终为空。
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
并将配置链接到测试用例
@ContextConfiguration(locations = {"/modality-test-config.xml"})
我确定它必须是某个地方的次要细节,但是我似乎在Service的JUnit测试中似乎没有得到非空的验证器。
更新
这是我在TheHeadRush注释之后添加的TestConfiguration类。
@TestConfiguration
public class ModalityTestConfiguration {
@Bean("validator")
public Validator validator() {
return (Validation.buildDefaultValidatorFactory().getValidator());
}
}
我还在上面的Test类中添加了相应的@Import批注。
仍然没有运气:Validator字段在Test类和Service中都保持为空。另外,似乎没有调用TestConfiguration类中的断点。