【问题标题】:How do I unit test my REST Controller using Junit and Mockito?如何使用 Junit 和 Mockito 对我的 REST 控制器进行单元测试?
【发布时间】:2019-12-28 19:38:49
【问题描述】:

我在我的控制器中编写了一个简单的方法,作为我的 Java Spring Boot 应用程序的一部分,它可以正常使用,并且我已经使用 Postman 对其进行了测试。但是我不确定如何使用 Junit 和 Mockito 对此进行单元测试。我在下面展示了我的代码的 sn-p,首先是我的 Controller.java 类,然后我的测试在 ControllerTest.java 中。我怎样才能正确地进行单元测试?

编辑:我知道我的测试用例是问题所在,我已将其删除,因为所有 cmets 都在关注为什么它是错误的。我在问如何为这个特定的 saveCase 方法编写单元测试用例。

我已经尝试查看以下链接中的示例Rest Controller Unit TestSpring RestController + Junit Testing

@Autowired
Service service;

@PostMapping("/savecase")
public ResponseEntity<PIECase> saveCase(@Valid @RequestBody PIECase pieCase) {
    return ResponseEntity.ok(pieService.saveCase(pieCase));
}

【问题讨论】:

  • “似乎无法得到正确的结果” 什么是“正确”的结果?实际结果如何?
  • 测试应该验证控制器是否正常工作,即返回一个序列化为 JSON 的 PIECase 对象。但是您的测试会检查响应是否为"some expected response"。为了简单起见,您的测试相当于测试将 2 加到 3 的服务返回 42。测试就是问题所在。

标签: java spring-boot junit mockito


【解决方案1】:

你需要模拟所有在你的 Restcontroller 中调用的服务,这样就不会得到 Nullpointer 异常

RunWith(MockitoJUnitRunner.class) 声明将导致@Mock 和@InjectMocks 注释自动工作而无需任何显式初始化

 package com.khan.vaquar.controller;

import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.json.JSONException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.owasp.esapi.errors.IntrusionException;
import org.owasp.esapi.errors.ValidationException;
import org.springframework.beans.factory.annotation.Autowired;

import com.fasterxml.jackson.core.JsonProcessingException;


@RunWith(MockitoJUnitRunner.class)
public class RestControllerTest {

    private static Logger log = Logger.getLogger(RestControllerTest.class.getName());

    @InjectMocks
    private RestController restController;


    @Mock
    private RestServiceImpl restServiceImpl;

    @Mock
    private RestResponseBuilder restResponseBuilder;

    @Mock
    private HttpServletRequest request;

    @Autowired
    RuleEngine ruleEngine;

     @Test
    public void testRestControllereFlow() throws Exception {


        String inputJson="{  \r\n" + 
                "   \"Data\":{  \r\n" + 
                "      \"personalInfo\":{  \r\n" + 
                "         \"User\":{  \r\n" + 
                "           \"email\":\"vaquar.khan@gmail.com\",\r\n" + 
                "           \"name\": \"vaquar khan\"\r\n" + 
                "          
                "        , }}+ 
                "}";
        Response response =null;
        try {
            response=restController.restControllerMethd(inputJson);
            }catch(Exception e){
        //      e.printStackTrace();
            }
        assertNotNull(response);

    }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-17
    • 2012-07-08
    • 2019-07-07
    • 2014-02-08
    • 2015-07-26
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    相关资源
    最近更新 更多