为什么在使用 PowerMockRunner 运行时无法使用 @InjectMocks 字段匹配?

2024-06-28

我遇到了一个问题,其中字段注入与 Mockito 匹配@Mock注释为@InjectMocks在有 2 个的情况下不起作用@Mock相同类型的。我用过@Mock (name = "name_of_var")语法也是如此,但仍然失败......

这是被测试的类:

    import java.util.Date;
    public class Parent{

    private Date dateA;
    private Date dateB;

    public void setDateA(Date _dateA){
       dateA = _dateA;
    }

    public void setDateB(Date _dateB){
       dateB = _dateB;
    }

    public Date getDateA(){
       return dateA;
    }

    public Date getDateB(){
       return dateB;
    }

这是测试本身:

    @RunWith(PowerMockRunner.class)
    @PrepareForTest({System.class, Parent.class})
    public class testParent{

    @Mock (name = "dateB")  private Date someOtherDate;
    @Mock (name = "dateA")  private Date someDate;    

    @InjectMocks Parent p;

    @Before
    public void setup(){
        Mockito.when(someOtherDate.getTime()).thenReturn(500l);
        PowerMockito.mockStatic(System.class);
        PowerMockito.when(System.currentTimeMillis()).thenReturn(2000l);
    }

    @Test
    public void testGetDateAGetTimeShouldReturn1000() {
        Mockito.when(someDate.getTime()).thenReturn(1000l);
        Date result = p.getDateA();
        assertEquals(1000l, result.getTime());
    }

    @Test
    public void testGetDateBGetTimeShouldReturn500() {
        Date result = p.getDateB();
        assertEquals(500l, result.getTime());   
    }

测试时,两者assertEquals导致NullPointerException由于以下事实:@InjectMocks不工作。

现在,当我更换@RunWith(PowerMockRunner.class) with @RunWith(MockitoJUnitRunner.class),效果很好。

另外,如果我刚刚定义了 1Date变量(比如说,dateA ) in Parent.java以及要注入的匹配模拟ParentTest,它会很好地使用PowerMockRunner.class.

我必须使用 PowerMockRunner.class 运行的原因是我必须能够模拟静态函数以及构造函数。

我正在使用 Junit4.12、Mockito-all-1.10.19 和 PowerMock-mockito-1.6.2-full 运行。

有谁知道为什么它不能正确注入的原因PowerMockRunner.class?运行时是否有解决方法PowerMockRunner.class?


如果您要使用PowerMockRunner,你必须打电话MockitoAnnotations.initMocks() http://docs.mockito.googlecode.com/hg/org/mockito/MockitoAnnotations.html#initMocks(java.lang.Object)为了初始化使用注释创建的模拟。

然而,有几个充分的理由不使用InjectMocks根本不。一般来说,您对测试的设置方式的控制较少。最好直接打电话new并手动传递参数。另外,如果出现任何问题,Mockito 都会默默地失败。更多内容请参阅本文 https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/:

Mockito 将尝试仅按顺序通过构造函数注入、setter 注入或属性注入来注入模拟,如下所述。如果以下任一策略失败,则 Mockito 不会报告失败;也就是说,您必须自己提供依赖项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在使用 PowerMockRunner 运行时无法使用 @InjectMocks 字段匹配? 的相关文章

  • 何时选择 JMS API 而不是 UDP 套接字 API,反之亦然?

    有哪些原因可以促使程序员在分布式 Java 应用程序中使用 Java JMS Java 消息服务 API 而不是 java net 包的 UDP 套接字 API 或者使用 UDP 套接字 API 而不是 JMS API 如果可能 请给出应用
  • Thymeleaf 循环直到一个数字

    我使用 Thymeleaf 进行搜索并从服务器获取响应 这保存了结果的数量 response count 我想进行这样的迭代 for int i 1 i lt response count i if response page i
  • Lucene 通过 URL 搜索

    我正在存储一个具有 URL 字段的文档 Document doc new Document doc add new Field url url Field Store YES Field Index NOT ANALYZED doc add
  • JCombo AutoComplete - 模式或反向查找

    我正在使用swingx 库中的自动完成装饰器 http download java net javadesktop swinglabs releases 0 8 docs api org jdesktop swingx autocomple
  • 如何删除 JComboBox 的“单击并查看下拉菜单”功能?

    我有一个 JComboBox 它使用 GlazedLists 添加预输入功能 我希望用户输入一个字符串并看到预先输入的内容 这要归功于 Glazedlists 但是 我不希望用户能够单击组合框的向下箭头并检查下拉列表 我已使向下箭头不可见并
  • 协程内的具体化泛型参数不起作用

    我正在创建 http json 客户端 我将 Volley 与协程结合使用 我想创建通用的 http 客户端 这样我就可以在任何地方使用它 我创建了通用扩展方法来将 JSON 字符串解析为对象 inline fun
  • 在连续 8 个测量到的 GC 抖动周期后关闭 JVM

    我正在编写 Apache beam BAtch 数据流 其中从 GCS 写入到 BQ 我的数据包含400万条记录 我已指定n1 HighMem 8机器类型 我的数据流以少量数据形式工作 我的用例我的模式不固定 所以我使用了 getFaile
  • 使用 Spring 依赖注入时,Hibernate SessionFactory 始终为 null

    我得到了NullpointerException在我的保存方法中CityDaoImpl 看来sessionFactory没有自动装配 因为在调试时发现 sessionFactory 从未被注入CityDaoImpl 我浏览了很多答案 但没有
  • 未知的 UTF-8 代码单元闭合双引号

    我的问题如下 我正在读取一个 XML 文件 其文本节点部分包含 UTF 8 版本的打开和关闭双引号 文本被提取 缩短为 3999 字节并放入新的 XML 格式 然后保存为文件 虽然 Notepad 在输入文件中正确显示了这两个符号 但输出文
  • Java 中 getter 的命名约定有多重要?

    我非常相信一致性 因此也相信惯例 然而 我目前正在用 Java 开发一个框架 其中这些约定 特别是get set前缀约定 似乎妨碍了可读性 例如 有些课程会有id and name属性和使用o getId 代替o id 由于多种原因 这似乎
  • 模块化应用程序堆栈中的虚拟数据和单元测试策略

    如何管理用于测试的虚拟数据 将它们保留在各自的实体中 在一个单独的测试项目中 使用外部资源的序列化程序加载它们 或者只是在需要的地方重新创建它们 我们有一个应用程序堆栈 其中包含多个模块 这些模块依赖于另一个模块 每个模块都包含实体 每个模
  • 获取Java InputStream后面的文件的字节数

    正如标题所示 我需要知道文件在输入流 后面 有多少字节 我不想下载所有字节和计数 需要很长时间 我只需要知道文件有多少字节 像这样 int numberOfBytes countBytes inputStream 所以 我需要 countB
  • 无法远程连接JMX?

    由于某些奇怪的原因 我无法使用VisualVM or jconsole到 JMX 用于启动要监控的VM的参数 Dcom sun management jmxremote Dcom sun management jmxremote authe
  • 如何使用鼠标指针和键盘快捷键捕获文本?

    我想使用 C 或 java 使用鼠标指针和键盘快捷键从打开的窗口捕获文本 喜欢babylon http babylon com 所以 我需要知道什么以及如何实施 我需要使用哪些库 或者我可以使用 winapi 吗 使用脚本语言创建您想要执行
  • 将一串数字转换为数组

    我在创建将数字字符串转换为数组的程序时遇到问题 我知道这里有一个类似的问题 但我所要做的只是一组数字 例如 10 15 16 0 57 438 57 18 这是我到目前为止所拥有的 import java util Scanner publ
  • Java 打印 PDF 并带有选项(装订、双面打印等)

    我有一个打印 PDF 的 java 程序 它使用 Apache PDFBox 创建PDDocument对象 来自 pdf 文档或某些情况下来自流 然后使用javax print API private boolean print File
  • 查找 Maven 使用的 Java 选项

    如何找到 Maven 正在使用哪些 Java 选项 Xmx Xms Xss 等 我发现有一种方法set它们是通过环境 MAVEN OPTS 实现的 现在我想要一种方法来确保它获得正确的设置 编辑 我相信它有所不同这个问题 https sta
  • 在 C# 中获取 Selenium RemoteWebDriver 的会话 ID

    我正在尝试获取在 SauceLabs 云上运行的测试的会话 ID 但我似乎无法访问它 我尝试过以下方法 Returns null var sessionId string RemoteWebDriver driver Capabilitie
  • 使用递归求数字之和

    对Java来说相当陌生 但我正在编写一个教程 其中我必须使用递归找到用户输入整数的数字总和 到目前为止 这是我的代码 公开课其他 public static void main String arg Scanner s new Scanne
  • 有人可以推荐 java 8 模式来替换 switch 语句吗?

    我有以下代码 public class A private String type String getType return type 现在在许多代码位置我都有这样的代码 switch a geType case A return new

随机推荐