Mockito @InjectMocks 策略

Mockito @InjectMocks Strategy

是的,我知道,关于 Mockito 的 @InjectMocks 已经写了很多,但还有一个问题我没能解决...

假设我们有一个 class 有四个成员...

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 搜索合适的模拟。找到两个合适类型的候选人,所以寻找名字。 None 个名称匹配。结尾。 b1 为空,正确。
  2. 为字段 b2 搜索合适的模拟。找到两个合适类型的候选人,所以寻找名字。其中一个名字匹配。 b2 已正确填充模拟 "b2"。
  3. 为字段 b3 搜索合适的模拟。只有一个候选 ("b4") 被发现具有合适的类型,所以使用那个。 b3 被 mock "b4" 错误填充。
  4. 没有为字段 b4 留下的模拟,将保持为空(错误地)。

因此,唯一的解决方案是总是多添加一个模拟(这样对于所有需要的模拟,总是至少有 2 个候选者):

@Mock(name = "fakeyMcFakeFake")
private B fakeyMcFakeFake;

(当然,第二遍会把fakeyMcFakeFake注入b1字段,但至少其他字段会填充正确的mocks)。但这真的可以解决吗?有谁知道为什么没有更好地处理或如何更好地处理它?

( 至于用例...我有一个控制器,它有各种文本框等作为成员(它们将被注入实时代码),显然它们中的许多都是相同类型的,但对于每个测试我只需要一小部分。)

这已在拉取请求中修复 #215 (see release notes)。我怀疑你的代码是关于旧版本的 mockito。

虽然我喜欢 powermock,但我建议设计代码时使用模拟测试不依赖于 powermock。

同样对于powermock,要么升级到1.6.4版本(刚刚发布);要么powermock github 存储库中存在一个问题 (#14),它将依赖关系更改为 mockito-core。 否则请在声明 powermock 依赖项时排除 mockito-allmockito-all 是非 Maven 用户(仍然使用中央存储库)的依赖项。但是我不确定未来的 mockito 2.x beta 是否与当前的 (1.6.x) powermock 版本兼容。