如何实际测试具有空指针异常的控制器的服务器响应

时间:2019-04-16 14:22:00

标签: java spring rest

我想编写一个测试,该测试在处理请求时评估具有NullPointerException的控制器的响应。

为此,我编写了一个在处理请求时抛出NullPointer的控制器。使用MockMVC控制器,我向该控制器发送GET请求。

在处理Null指针时抛出该控制器的控制器:

@Controller
public class Controller{  

    @GetMapping(value = "/api/data")
    @ResponseBody
    public ResponseEntity<Resource> getData() {

        if (true)
            throw new NullPointerException(); // Intended Nullpointer Exception 

        return ResponseEntity.notFound().build();
    }
}

我期望收到500错误的测试功能:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc

public class Test {

    @Autowired
    protected MockMvc mockMvc;

    @Test
    public void shouldReturn500StatusWhenControllerThrowsAnException() throws Exception {
        MvcResult result = this.mockMvc.perform(get("/api/data"))
            .andExpect(status().is5xxServerError())
            .andReturn();
    }

}

我希望MockMVC请求返回错误500,就像真实控制器作为服务器运行时一样。 实际上,实际上MockMVC只是由于NullPointer异常而失败,并且不返回任何内容。

2 个答案:

答案 0 :(得分:0)

在将更多信息添加到原始问题后,进行

EDIT: 我遇到了同样的问题,请尝试使用这些注释,而不要使用三个注释:

@RunWith(SpringRunner.class)
@WebMvcTest
@AutoConfigureWebClient

答案 1 :(得分:0)

我找到了一个使用WebTestClient的解决方案。

向我的build.gradle添加了两个新的依赖项:

<Field
    name="username"
    validate={debounceUsernameValidation}
>
    {({ field, form }: FieldProps) => (
        <Fragment>
            <input
                {...field}
                className={classNames('form-control', {
                    'is-invalid': form.errors[field.name] &&
                        form.touched[field.name]
                })}
                placeholder="Username (Required)"
                type="text"
            />
            <ErrorMessage 
                name={field.name} 
                component="div" 
                className="text-danger" 
            />
        </Fragment>
    )}
</Field>

测试功能如下:

testCompile "org.springframework.boot:spring-boot-starter-webflux:2.1.3.RELEASE"
testCompile "org.springframework.boot:spring-boot-starter-test:2.1.3.RELEASE"

就像GET请求返回的错误500一样,它在现实世界中的情况也是如此。