这个异常告诉你什么......
您尚未在字段声明中提供实例
换句话说,你没有写...
@InjectMocks
A a = new A("foobar", 123);
这是完全可以接受的,并且可能会解决您的问题。请记住,此时模拟不会被初始化,所以如果您确实需要一个示例,那也没关系String
and int
在那里,但如果你需要在那里放置模拟,则不需要。换句话说,如果你有一个带有 X 的构造函数,你会写 newA(x)
这里,x 将为空,因为@Mock
注释尚未被处理。
所以我尝试构建实例
因为没有实例(因为您没有提供实例),所以它尝试创建一个实例,但是......
但是,构造函数或初始化块抛出异常:null
所以,你的构造函数抛出 null。看起来像你的someMethodCall
依赖于参数(端口,最有可能)不为空,但因为它们是String
and int
,Mockito 不知道在那里使用什么值。自从port
是一个原始类型,并且 Mockito 不专门处理这些类型,问题可能就在那里 - Mockito 会尝试将 null 放在那里,这将引发异常。
例如,如果您的构造函数匹配 X 和 Y,Mockito 可能会尝试将模拟放在那里,但事实并非如此。构造函数想要String
and int
并且没有针对它们的模拟,因此 Mockito 只能使用默认值,这些是null
,这是一个问题port
(因为int
).
那么,解决办法是什么呢?
1) 要么让你的构造函数空安全,允许在那里给出空端口(并确保 ip 字符串也以空安全方式处理)。
2)使用你没用过的东西:
@InjectMocks
A a = new A("foobar", 123);
无论如何,不需要在构造函数中拥有所有依赖项,Mockito 可以直接将它们注入到字段中。因此,为 X 和 Y 添加另一个构造函数并不是真正的解决方案。当然,一般来说,构造函数注入比字段注入更可取,但那是另一个话题了。
至于你关于哪个构造函数的问题:文档 https://static.javadoc.io/org.mockito/mockito-core/2.12.0/org/mockito/InjectMocks.html说这个...
选择最大的构造函数,然后仅使用测试中声明的模拟来解析参数
Edit:看来 Mockito 不知道如何处理构造函数中的原始字段,真是可惜。