Mockito @InjectMocks Strategy



是的,我知道,关于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
}

为什么?我调试了整个程序,发现它是这样的。。。

  1. 为字段b1搜索适当的mock。找到了两个合适类型的候选者,所以请查找名称。没有一个名称匹配。终止b1为空,正确
  2. 为字段b2搜索适当的mock。找到了两个合适类型的候选者,所以请查找名称。其中一个名称匹配。b2正确填充了模拟"b2"
  3. 为字段b3搜索适当的mock。只有一个候选者("b4")具有合适的类型,因此请使用该候选者。b3未正确填充模拟"b4"
  4. 字段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-allmockito-all是非maven用户(仍在使用中央存储库)的依赖项。然而,我不确定未来的mockito 2.x测试版是否能与当前的(1.6.x)powermock版本兼容。

相关内容

  • 没有找到相关文章

最新更新