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
}
为什么?我调试了整个东西,发现它是这样的...
- 为字段
b1
搜索合适的模拟。找到两个合适类型的候选人,所以寻找名字。 None 个名称匹配。结尾。 b1
为空,正确。
- 为字段
b2
搜索合适的模拟。找到两个合适类型的候选人,所以寻找名字。其中一个名字匹配。 b2
已正确填充模拟 "b2"。
- 为字段
b3
搜索合适的模拟。只有一个候选 ("b4") 被发现具有合适的类型,所以使用那个。 b3
被 mock "b4" 错误填充。
- 没有为字段
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-all
,mockito-all
是非 Maven 用户(仍然使用中央存储库)的依赖项。但是我不确定未来的 mockito 2.x beta 是否与当前的 (1.6.x) powermock 版本兼容。
是的,我知道,关于 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
}
为什么?我调试了整个东西,发现它是这样的...
- 为字段
b1
搜索合适的模拟。找到两个合适类型的候选人,所以寻找名字。 None 个名称匹配。结尾。b1
为空,正确。 - 为字段
b2
搜索合适的模拟。找到两个合适类型的候选人,所以寻找名字。其中一个名字匹配。b2
已正确填充模拟 "b2"。 - 为字段
b3
搜索合适的模拟。只有一个候选 ("b4") 被发现具有合适的类型,所以使用那个。b3
被 mock "b4" 错误填充。 - 没有为字段
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-all
,mockito-all
是非 Maven 用户(仍然使用中央存储库)的依赖项。但是我不确定未来的 mockito 2.x beta 是否与当前的 (1.6.x) powermock 版本兼容。