JUnit5 - Rest API controller having custom spring validator is failing

Viewed 28

I have a controller that accepts path parameter called 'jobName'. The @ValidateJobName is the custom validator that validates the user input. If the input is wrong then it throws the error below

"Invalid Job name, valid job names are: vendor, service, product, pricing, currency, contract"

The issue I am facing is that, when I am testing my rest controller API the test case always fails by returning the above error even when the job name is one of the acceptable values but when I remove @ValidateJobName custom annotation from the controller my test cases gets passed.

The @ValidateJobName and Controller works all good when triggered from Postman client but when I do unit testing the test case fails.

I have tried lot of blogs and googled but could not get a solution, Below are my Controller and JUnit testcase.

Please help!

JobController.java

@Validated
@Slf4j
@RestController
public class JobController {
 
    @Autowired
    ReportService reportService;
 
    @Autowired
    ReportConfig reportConfig;
 
    @RequestMapping(value = "/importjob/{jobName}", method = RequestMethod.GET)
    ResponseEntity<DataIntegrationResponse> getReport(@PathVariable @ValidateJobName String jobName) throws Exception {
    log.info("Received a request to launch the " + jobName + " Job");
    return reportService.getReport(jobName);
    }
}

JobControllerTest.java

@ExtendWith(MockitoExtension.class)
@WebMvcTest(JobController.class)
@AutoConfigureMockMvc
public class JobControllerTest {
 
    @MockBean
    ReportService reportService;
    
    @MockBean
    ReportConfig rep;
    
    @MockBean
    JobMapping jmap;
 
    @Autowired
    public MockMvc mockMvc;
    
  
    @Test
    public void testGetReport() throws Exception {
    String jobNameInput="vendor";
    HttpStatus httpStatus = HttpStatus.OK;
    String fitsReportName = "idex_fits_vendor.csv";
    String jobName = "WFitsVendorJob";
    String jobStatus = "STARTED";
    Long jobInstanceId = 1022L;
    String message = "WFitsVendorJob triggered successfully.";
 
    DataIntegrationResponse response = new DataIntegrationResponse(LocalDateTime.now(), httpStatus, fitsReportName, jobName, jobStatus, jobInstanceId, message);    
 
    ResponseEntity<DataIntegrationResponse> responseEntity = new ResponseEntity<DataIntegrationResponse>(response, HttpStatus.OK);
    
    Mockito.when(reportService.getReport(jobNameInput)).thenReturn(responseEntity);
    
    mockMvc.perform(get("/importjob/{jobName}", "vendor")).andExpect(status().isOk());
 
    }

JobNameValidator.java

@Component

public class JobNameValidator implements ConstraintValidator<ValidateJobName, String>{

    @Autowired
    private JobMapping jobMap;

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
    if (value!=null && !jobMap.getMappings().containsKey(value)) { return false; }
        return true;
    }

}

ValidateJobName.java - interface

@Documented
@Constraint(validatedBy = JobNameValidator.class)
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ValidateJobName {
    String message() default "Invalid Job name, valid job names are: vendor, service, product, pricing, currency, contract";
    Class<?>[] groups() default {};
    Class<? extends Payload> [] payload() default {};
}
 

0 Answers
Related