浅斟慢酌守清欢 2023-04-19 15:43 采纳率: 14.3%
浏览 81
已结题

PowerMockito模拟返回时报空指针异常

我这边在做单元测试覆盖率的测试,因为有个工具类中的一个方法不能通过具体的实际数据返回,所以需要模拟,当前项目用的是PowerMockito,我这边在模拟的时候报了空指针异常,debug发现,程序在执行PowerMockito.when这个语句时,进入了方法内部逻辑,没有模拟返回,请问一下我这个要怎么模拟才可以啊,代码如下:
工具类

@Component
@Slf4j
public class routerutil {
public static final string piccycpt = "picc-ycpt";
public static final string URL_GETCOMCODE ="/common/getCwComCode";
public static final string cW_coM_code ="cwComCode";

@Autowired
private RestTemplateUtil restTemplate:

public ApiResponse doPostForobj(string value, string url) {
JSONObject param = new JSONObject();
param.put("comCode",value);
return restTemplate.postForobj(param, url, ApiResponse.class);

测试类:

@RunWith(PowerMockRunner.class)
public class RouterutilTest {

private RouterUtil routerUtil = new RouterUtilo;
private RestTemplateUtil restTemplate = new RestTemplateUtil();
private ApiResponse apiResponse = new ApiResponse();

@Before
public void setup() {
Whitebox.setInternalstate(routerUtil, fieldName: "restTemplate",restTemplate);

@Test
public void dopostForObjTest() {
try {
Map<String,String> testMap = new HashMap<>();
testMap.put("test","test");
apiResponse.setData(testMap);
//Mockito.when(restTemplate.postFor0bj(Mockito.any(JSONObject.class)Mockito.anyString(),ApiResponse.class)).thenReturn(apiResponse
//Class<?>[] paramTypes =new Class[]{Object.class,string.class, Class.class};
//PowerMockito.stub(PowerMockito.method(RestTemplateUtil.class,“postFor0bj",paramTypes)).toReturn(apiResponse);
PowerMockito.when(restTemplate.postFor0bj(RestTemplateUtil.class,url: "postFor0bj",Mockito.anyO)).thenReturn(apiResponse);
Apiresponse result = routerUtil.doPostForObj( value: "test", url: "test");
}catch (Exception e){
e.printstackTrace();
}}

工具类中引入的RestTemplateUtil类:

img

报错语句如截图:

img

因为在模拟返回的时候,进入了RestTemplateUtil源码逻辑,而创建RestTemplateUtil对象时,没有深层次创建,所以这里报了空指针异常。当我给RestTemplateUtil中的restTemplate初始化值以后,又会报其他的错。我觉得模拟的时候应该不关心这个方法内部的逻辑,只要是调用到这个方法就应该返回模拟的结果,不清楚为什么进入了方法内部。

博主2301测试:

img

img

博主夜枭龙测试:

img

博主蓝白测试:

img


博主zyb测试:

img

img

  • 写回答

4条回答 默认 最新

  • 「已注销」 2023-04-19 15:54
    关注

    你好,根据你提供的代码,可以尝试以下两种方法来模拟 restTemplate.postForobj 方法的返回值:

    1 使用 Mockito 来进行模拟
    在测试方法中,可以使用 Mockito 的 Mockito.when() 方法来模拟 restTemplate.postForobj 方法的返回值,示例代码如下:

    Mockito.when(restTemplate.postForobj(Mockito.any(JSONObject.class), Mockito.anyString(), Mockito.eq(ApiResponse.class)))
           .thenReturn(apiResponse);
    

    2 使用 PowerMockito 来进行模拟
    在测试方法中,可以使用 PowerMockito 的 PowerMockito.when() 方法来模拟 restTemplate.postForobj 方法的返回值,示例代码如下:

    PowerMockito.when(restTemplate.postForobj(Mockito.any(JSONObject.class), Mockito.anyString(), Mockito.eq(ApiResponse.class)))
                .thenReturn(apiResponse);
    

    其中,Mockito.any() 方法表示任意类型的参数都可以匹配,Mockito.eq() 方法表示匹配指定的参数值。

    请注意,在使用 PowerMockito 进行单元测试时,需要在测试类的头部使用 @RunWith(PowerMockRunner.class) 注解来运行测试类。

    @RunWith(PowerMockRunner.class)
    public class RouterUtilTest {
        // 测试代码
    }
    

    希望能帮到你!

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月27日
  • 修改了问题 4月20日
  • 修改了问题 4月20日
  • 修改了问题 4月20日
  • 展开全部

悬赏问题

  • ¥15 想问一下这种情况怎么解决呢(关键词-file)
  • ¥15 python Flassk 模块部署 服务器时报错
  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)