是的,我知道,关于Mockito的@InjectMocks已经写了很多文章,但仍然有一个问题我无法解决。。。
假设我们有一个有四名成员的班级。。。
class A {
public B b1;
public B b2;
public B b3;
public B b4;
}
B
是一个空接口。。。
interface B {
}
则该设置将无法正确初始化:
class MyTest {
@InjectMocks
private A a;
@Mock(name = "b2")
private B b2; // will correctly be injected into field b2
@Mock(name = "b4")
private B b4; // will be injected into field b3
@Before
public void init() {
MockitoAnnotations.initMocks( this );
}
// some test here
}
为什么?我调试了整个程序,发现它是这样的。。。
- 为字段
b1
搜索适当的mock。找到了两个合适类型的候选者,所以请查找名称。没有一个名称匹配。终止b1
为空,正确 - 为字段
b2
搜索适当的mock。找到了两个合适类型的候选者,所以请查找名称。其中一个名称匹配。b2
正确填充了模拟"b2" - 为字段
b3
搜索适当的mock。只有一个候选者("b4")具有合适的类型,因此请使用该候选者。b3
未正确填充模拟"b4" - 字段
b4
没有留下模拟,将保持为空(错误地)
因此,唯一的解决方案是总是比需要的多添加一个mock(这样对于所有需要的mock,总是至少有两个候选):
@Mock(name = "fakeyMcFakeFake")
private B fakeyMcFakeFake;
(当然,fakeyMcFakeFake将在第二次传递中被注入b1字段,但至少其他字段将填充正确的mock)。但这真的能成为一个解决方案吗?有人知道为什么这件事没有得到更好的处理,或者如何处理得更好吗?
(至于用例……我有一个控制器,它有各种文本框等作为成员(这些文本框将被注入到实时代码中),显然其中许多都是相同类型的,但对于每个测试,我只需要少量文本框。)
这已在拉取请求#215中修复(请参阅发行说明)。我怀疑您的代码是关于mockito的旧版本。
虽然我喜欢powermock,但我建议设计代码时不要依赖powermock
同样对于powermock,可以升级到1.6.4版本(刚刚发布);powermock github存储库中存在一个问题(#14),该问题将依赖关系更改为mockito-core
。否则,请在声明powermock
依赖项时排除mockito-all
,mockito-all
是非maven用户(仍在使用中央存储库)的依赖项。然而,我不确定未来的mockito 2.x测试版是否能与当前的(1.6.x)powermock版本兼容。