当前位置: 首页 > 知识库问答 >
问题:

@InjectMocks、构造函数或初始化块引发异常

谭勇
2023-03-14
class A {
    private X x;
    private Y y;
    public A(String ip, int port) {
       this(someMethodCall(ip, port)); //
    }

    private A(X x) {
        this.x = x;
        this.y = new Y();
    }
}
UT:
public class ATest() {
    @InjectMocks A a;
    @Mock X x;
    @Mock Y y;
    @Test ...
}

共有1个答案

商焕
2023-03-14

这个诅咒告诉你的是...

您还没有在字段声明中提供实例

换句话说,你没有写...

@InjectMocks 
A a = new A("foobar", 123);

例如,如果构造函数匹配X和Y,Mockito可能会尝试将模拟放在那里,但它没有。构造函数需要stringint,但没有针对它们的mock,因此Mockito只能使用默认值,这些默认值是null,这对于port来说是个问题(因为int)。

那么,有什么解决办法呢?

1)要么使您的构造函数为空安全的,允许在那里提供一个空端口(并确保ip字符串也以空安全的方式处理)。

2)使用你没有使用的东西:

@InjectMocks 
A a = new A("foobar", 123);

在任何情况下,不需要在构造函数中包含所有的depedencies,Mockito会很好地将它们直接注入到字段中。所以为X和Y添加另一个构造函数不是一个真正的解决方案。当然,一般来说,构造函数注入比字段注入更好,但这是另一个主题。

至于您关于哪个构造函数的问题:文档是这样说的...

 类似资料:
  • 问题内容: 我有两个班,第一个是我的主班,第二个是我的编辑框架班。 我的第二个类(UpdateGUI)在其构造函数中提供oldName,并对其进行编辑,当我单击时,它将newName发送给我的第一个类。 我的第二堂课: 我的问题是,为什么newName为null? 更新: UpdateGUIDialog类: 输出: 我需要打印而不是null。 问题答案: Java对象有点像真实对象。并顾名思义:它

  • 主要内容:初始化 const 成员变量构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用 初始化列表。 C++构造函数的初始化列表使得代码更加简洁,请看下面的例子: 运行结果: 小明的年龄是15,成绩是92.5 李华的年龄是16,成绩是96 如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添

  • 映射对构造函数没有限制或要求 (__init__ )类的方法。您可以自由地为您想要的函数要求任何参数,为ORM未知的实例分配属性,并且通常在编写Python类的构造函数时做您通常会做的任何其他事情。 sqlAlchemy ORM不调用 __init__ 从数据库行重新创建对象时。ORM的过程有点类似于Python标准库的 pickle 模块,调用低级 __new__ 方法,然后在实例上悄悄地恢复属

  • 我有一个最终的会员数据: 在构造函数中,的初始化如下: 现在,不幸的是,Foo的构造函数可能会引发异常: 但是现在编译器抱怨foo可能没有被初始化,如果foo的构造函数抛出异常,这是真的。但是如果我将放入catch大括号中,它会抱怨foo可能已经初始化。 Foo是我无法修改的第三方库。

  • 生成类对象时,其成员可以用类的构造函数初始化。构造函数是与类同名的成员函数。程序员提供的构造函数在每次生成类对象(实例化)时自动调用。构造函数可以重载.提供初始化类对象的不同方法。数据成员应在类的构造函数中初始化或在生成对象之后设置其数值。 常见编程错误 6.7 类的数据成员只能在类定义中初始化。 常见编程错误 6.8 试图声明构造函数的返回类型和返回植是个语法错误。 编程技巧 6.5 适当时候(

  • 问题内容: 在Java中,但是在其他OO语言中,初始化属性定义之间也有区别,例如 并使用构造函数对其进行初始化? 我想不出任何实际的区别,有没有?否则,即使结果相同,是否存在一种方法优于另一种方法的情况? 问题答案: 初始化顺序在这里很重要。 将字段设置为默认初始值(0,false,null) 调用对象的构造函数(但不要执行构造函数的主体) 调用超类的构造函数 使用初始化程序和初始化块初始化字段