如何在基于SpringBoot的服务的JUnit测试中注入Validator?

时间:2019-05-10 19:48:00

标签: spring spring-boot junit hibernate-validator

我正在基于一个调用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创建专用的配置文件
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

并将配置链接到测试用例

@ContextConfiguration(locations = {"/modality-test-config.xml"})
  • 我尝试为验证器定义本地@Bean
  • 我在有无@Autowire的情况下玩耍
  • 我已经更改了@RunWith

我确定它必须是某个地方的次要细节,但是我似乎在Service的JUnit测试中似乎没有得到非空的验证器。

更新

这是我在TheHeadRush注释之后添加的TestConfiguration类。

@TestConfiguration
public class ModalityTestConfiguration {

    @Bean("validator")
    public Validator validator() {
        return (Validation.buildDefaultValidatorFactory().getValidator());
    }
}

我还在上面的Test类中添加了相应的@Import批注。

仍然没有运气:Validator字段在Test类和Service中都保持为空。另外,似乎没有调用TestConfiguration类中的断点。

0 个答案:

没有答案