当我使用超过1个ArgumentCaptor参数时,我收到一个Nullpointer.可能有人知道出了什么问题?

@RunWith(PowerMockRunner.class)

@PrepareForTest(FileHelper.class)

public class MyTest {

...

@Before

public void setUp() throws Exception {

PowerMockito.mockStatic(FileHelper.class);

}

@Test

public void save() throws Exception {

ArgumentCaptor argName = ArgumentCaptor.forClass(String.class);

ArgumentCaptor argList = ArgumentCaptor.forClass(List.class);

PowerMockito.doNothing().when(FileHelper.class, "saveTextFile", argName.capture(),

argList.capture());

...

}

FileHelper类中的saveTextFile方法:

public static void saveTextFile(String filename, List data) {

...

}

如果我运行代码,我会得到以下异常:

java.lang.NullPointerException

at java.lang.Class.isAssignableFrom(Native Method)

at org.powermock.reflect.internal.WhiteboxImpl.checkIfParameterTypesAreSame(WhiteboxImpl.java:2432)

at org.powermock.reflect.internal.WhiteboxImpl.getMethods(WhiteboxImpl.java:1934)

at org.powermock.reflect.internal.WhiteboxImpl.getBestMethodCandidate(WhiteboxImpl.java:1025)

at org.powermock.reflect.internal.WhiteboxImpl.findMethodOrThrowException(WhiteboxImpl.java:948)

at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:882)

at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:859)

at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:466)

at org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:106)

如果我调用一个只有一个参数的方法,即list参数一切正常.

最佳答案 我想你可能想用“验证”代替什么时候.

你正在设定一个期望你的模拟“无所事事”.

调用正在测试的方法然后验证您预期会发生什么事情并不是更好吗?

例如,考虑这两个类……

HelperClass.java

public class HelperClass {

public static void nastyStaticCall(String filename, List data) {

System.out.println("REAL METHOD CALLED!!");

}

}

MyClass.java

import java.util.Arrays;

public class MyClass {

public void testMethod() {

HelperClass.nastyStaticCall("FILENAME", Arrays.asList("Data"));

}

}

如果我想测试“MyClass”,我会做这样的事……

import static org.fest.assertions.Assertions.assertThat;

import static org.powermock.api.mockito.PowerMockito.mockStatic;

import static org.powermock.api.mockito.PowerMockito.verifyStatic;

import java.util.List;

import org.junit.Before;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.mockito.ArgumentCaptor;

import org.mockito.Captor;

import org.mockito.MockitoAnnotations;

import org.powermock.core.classloader.annotations.PrepareForTest;

import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)

@PrepareForTest(HelperClass.class)

public class MyClassTest {

private MyClass classUnderTest;

@Captor

private ArgumentCaptor fileNameCaptor;

@Captor

private ArgumentCaptor> dataCaptor;

@Before

public void setup() {

MockitoAnnotations.initMocks(this);

mockStatic(HelperClass.class);

classUnderTest = new MyClass();

}

@Test

public void shouldMakeNastyStaticCall() {

classUnderTest.testMethod();

verifyStatic();

HelperClass.nastyStaticCall(fileNameCaptor.capture(), dataCaptor.capture());

assertThat(fileNameCaptor.getValue()).isEqualTo("FILENAME");

assertThat(dataCaptor.getValue()).containsOnly("Data");

}

}

如您所见,所有这些测试方法都会调用实际代码,然后验证是否使用正确的参数调用了辅助类.

如果您实际上期望静态方法调用返回一个值,该值将由您正在测试的方法的其余部分使用,那么您将需要使用“when”,但是当返回“void”时,您不需要做任何事.

一般来说,我个人避免在“when”条款中使用参数捕获者,并将其留在“验证”阶段.

希望这可以帮助.

java argument_java – 如何使用多个ArgumentCaptor参数相关推荐

  1. Java虚拟机5:常用JVM命令参数

    这里汇总一些平时用到的.看到的一些虚拟机参数: (1)-Xms20M 表示设置堆容量的最小值为20M,必须以M为单位 (2)-Xmx20M 表示设置堆容量的最大值为20M,必须以M为单位.将-Xmx和 ...

  2. java canonicalize_java.io.IOException:java.io.WinNTFileSystem.canonicalize0处的无效参数

    我正在使用Eclipse Mars和Tomcat v8.0.30,jre 1.8.0_73.昨天我没有任何问题,但今天我的Tomcat服务器无法启动.弹出一个对话框,它说:"开始在本地主机的 ...

  3. Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

    Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...

  4. 在JAVA语言程序中main_在Java程序main方法中,正确的参数是

    [单选题]下列叙述中,错误的是 [填空题]Access属于()数据库,Access中,不允许在主关键字字段中有重复值或(). [单选题]如下哪些字符串是Java中的标识符? [填空题]常用的基本电量传 ...

  5. java分布式对象——远程方法中的参数和返回值+远程对象激活

    [0]README 1)本文文字描述转自 core java volume 2, 旨在学习 java分布式对象--远程方法中的参数和返回值+远程对象激活 的相关知识: [1]远程方法中的参数和返回值 ...

  6. java定义一个空数组_一个 Java 方法,最多能定义多少参数?

    点击上方"JAVA",星标公众号重磅干货,第一时间送达 文链接:http://justinblank.com/experiments/howmanytypeparametersca ...

  7. 什么是Java / JVM中的-Xms和-Xms参数(已更新至Java 13)

    什么是Java / JVM中的-Xms和-Xms参数(已更新至Java 13) 简而言之, Xmx指定应用程序可用的最大堆大小 Xms指定应用程序可用的最小堆大小 这些是Java虚拟机(JVM)参数, ...

  8. java 调用webservice 接口,并解析返回参数

    java 调用webservice 接口,并解析返回参数 1. 设置传参,例如以下格式: // 确定传参格式以及赋值 String reqXml = "<createAppParam& ...

  9. Java实现微信公众号直接发送参数二维码给用户

    文章目录 前言 一.参数二维码的作用 二.功能实现 1. 生成带参数二维码 2. 上传二维码图片 3. 发送带参数二维码给用户 总结 前言 公众号开发近些年是一个比较热门的方向,今天为大家讲解的是用J ...

最新文章

  1. 猜数游戏python_Hello,Python!小鲸教你学Python(九)之文件操作
  2. web中用纯CSS实现筛选菜单
  3. 5.2 使用pytorch搭建GoogLeNet网络 笔记
  4. xhprof windows下安装和使用(windows版本)
  5. python中内置的集成开发工具_python应用(3):启用集成开发工具pycharm
  6. IDEA或Webstorm设置Terminal终端字体大小
  7. 针对视觉位姿估计特征点优化问题的详细研究
  8. 在线PS(PhotoShop),打开PSD文件,图像处理
  9. Atitit java onvif 开源类库 getProfiles getStreamUri
  10. 正则只能输入数字java_正则表达式限制输入字符,数字,汉字等
  11. 新建samba配置步骤
  12. 三维激光LiDAR点云数据处理,我帮您!
  13. 音频系统测试软件:Smaart for Mac
  14. 5.4.1. Check Constraints
  15. 缠中说禅电子书_缠中说禅操盘术(高清) PDF 赵信 著
  16. p2p-如何拯救k8s镜像分发的阿喀琉斯之踵
  17. 囍游记----[转_]
  18. svn错误svn: E170000: Unrecognized URL scheme for http
  19. 一文简述BSD,System V ,POSIX,SUS版本历史, 以及glibc移植的特性测试宏
  20. 数据库学习笔记04——关系数据库2

热门文章

  1. JSbridge原理
  2. 【MATLAB】MATLAB 仿真模拟调制系统 — FM 系统
  3. ADB命令汇总 机顶盒相关操作
  4. 万字连载(上):如何 Bringup SoC 芯片
  5. Unity音频采样器(用于Unity音乐可视化)
  6. C语言有简单基础的入手指南(MOOC课程 浙大 翁凯老师主讲)听课笔记 the basic knowledge of C
  7. nginx安装部署(实操)
  8. 哈密尔顿算法matlab,[求助]关于哈密尔顿函数
  9. 米尔科技ZYNQ-7z020学习(1)
  10. 万象物语找回服务器,万象物语网络连接线异常怎么办 登录不上游戏解决方法...