如何使用Power Mock对Spring Boot Rest Controller和异常处理程序进行单元测试 [英] How to unit testing spring boot rest controller and exception handler using power mock

查看:512
本文介绍了如何使用Power Mock对Spring Boot Rest Controller和异常处理程序进行单元测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个简单的Spring引导应用程序,其中包含Employee控制器,如果所经过的年份大于2014,并且返回的是不小于2014,则返回Employee名称,然后抛出自定义异常,并在Exception Handler中对其进行处理.
我想使用powermock对异常流进行单元测试,但是我不确定该怎么做.我已经通过一些链接,但无法理解.
目前,我正在获取java.lang.IllegalArgumentException:需要WebApplicationContext.

I am having a simple Spring boot application which contains Employee controller which returns the Employee names if the year passed is greater than 2014 and if the it is not less than 2014 then I am throwing a custom exception and handling it in Exception Handler.
I want to unit test the exception flow using powermock but I am not sure how to do it. I have gone through some links but unable to understand.
Currently I am getting java.lang.IllegalArgumentException: WebApplicationContext is required.

EmployeeController.java

EmployeeController.java

@RestController
public class EmployeeController{

    @GetMapping(value = "/employee/{joiningYear}",produces = MediaType.APPLICATION_JSON_VALUE)
    public List<String> getEmployeeById(@PathVariable int joiningYear) throws YearViolationException {

        if(joiningYear < 2014){
            throw new YearViolationException("year should not be less than 2014");
        }else{

            // send all employee's names joined in that year 
        }
        return null;
    }
}   

ExceptionHandler

ExceptionHandler

@RestControllerAdvice
public class GlobalControllerExceptionHandler {


    @ExceptionHandler(value = { YearViolationException.class })
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ApiErrorResponse yearConstraintViolationExceptio(YearViolationException ex) {

        return new ApiErrorResponse(400, 5001, ex.getMessage());
    }
}

CustomException

CustomException

public class YearViolationException extends Exception {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public YearViolationException(String message) {

        super(message);
    }

}

Junit到单元测试异常处理程序

Junit to unit test exception handler

@RunWith(PowerMockRunner.class)
@WebAppConfiguration
@SpringBootTest
public class ExceptionControllerTest {

    @Autowired
    private WebApplicationContext applicationContext;

    private MockMvc mockMVC;

    @Before
    public void setUp() {

        mockMVC = MockMvcBuilders.webAppContextSetup(applicationContext).build();
    }

    @Test
    public void testhandleBanNotNumericException() throws Exception {

        mockMVC.perform(get("/employee/2010").accept(MediaType.APPLICATION_JSON)).andDo(print())
                .andExpect(status().isBadRequest())
        .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON));

    }
}

推荐答案

如其他人所述,您根本不需要模拟MVC.如果要测试REST端点,则需要TestRestTemplate. 与SpringRunner.class一起运行以及WebEnvironment设置都很重要.

As stated by others, you don't need mockMVC at all. If you want to test REST endpoints, what you need is TestRestTemplate. Runwith SpringRunner.class is important as well as the WebEnvironment setup.

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
public class RestServiceApplicationTests {

    private String baseUrl = "http://localhost:8090";

    private String endpointToThrowException = "/employee/2010";

    @Autowired
    private TestRestTemplate testRestTemplate;

    @Test(expected = YearViolationException.class)
    public void testhandleBanNotNumericException() {
        testRestTemplate.getForObject(baseUrl + endpointToThrowException, String.class);
}

这篇关于如何使用Power Mock对Spring Boot Rest Controller和异常处理程序进行单元测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆