简体   繁体   中英

NullPointerException thrown during junit test without @SpringBootTest annotation, but not with the annotation

When I remove the @SpringBootTest annotation, I get a NullPointerException during this test:

@SpringBootTest
@RunWith(MockitoJUnitRunner.class)
public class ExceptionInterceptorTests {

      private AysUserProvisException aysUserProvisException =
          new AysUserProvisException("Failed","True", "Failed to create user. User already exists.", null);

      @InjectMocks @Spy ExceptionInterceptor exceptionInterceptorSpy;
      
      @Test
      void testAysUserProvisException_generateCorrectResponseSchema() {
        ResponseEntity<Object> response = exceptionInterceptorSpy.handleAysUserProvisException(aysUserProvisException);
        
        AysUserProvisResponse exceptionResponse =
            new AysUserProvisResponse(
                "Failed", "True", "Failed to create user. User already exists.", null);
        ResponseEntity<Object> expected =
            new ResponseEntity<>(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);

        assertEquals(response.getBody(), expected.getBody());
      }

It is thrown when attempting to execute this method:

    @ControllerAdvice
    public class ExceptionInterceptor extends ResponseEntityExceptionHandler {
        
        @ExceptionHandler(AysUserProvisException.class)
          public final ResponseEntity<Object> handleAysUserProvisException(AysUserProvisException ex) {
            AysUserProvisResponse exceptionResponse =
                new AysUserProvisResponse(
                    ex.getStatus(), ex.getIsErrorOccurred(), ex.getMessage(), ex.getError());
            return new ResponseEntity<>(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
        }

Here is the AysUserProvisResponse class:

public class AysUserProvisResponse {
    
    private String status;
    private String isErrorOccurred;
    private String message;
    private Error  error = new Error();
    
    
    public AysUserProvisResponse() {
        super();
    }

    public AysUserProvisResponse(String status, String isErrorOccurred, String message, Error error) {
        super();
        this.status = status;
        this.isErrorOccurred = isErrorOccurred;
        this.message = message;
        this.error = error;
    }

How does the @SpringBootTest annotation avoid this exception? Why is it necessary?

You have to upload the spring context if in your code you are using the annotations or trying to inject beans.

Try to mock the dependencies of your Exception class and inject mocks into ExceptionInterceptor class

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM