gpt4 book ai didi

java - Mockito @InjectMocks 策略

转载 作者:行者123 更新时间:2023-11-30 03:08:27 26 4
gpt4 key购买 nike

是的,我知道,关于 Mockito 的 @InjectMocks 已经写了很多,但是仍然有一个问题我无法解决......

假设我们有一个有四名成员的类(class)...

class A {

public B b1;
public B b2;
public B b3;
public B b4;

}

...B 是一个空接口(interface)...

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 的正确模拟。找到了两个适合类型的候选人,所以寻找名字。没有一个名字匹配。结尾。 b1 为空,正确。
  2. 搜索字段 b2 的正确模拟。找到了两个适合类型的候选人,所以寻找名字。其中一个名字相符。 b2 已正确填充模拟“b2”。
  3. 搜索字段 b3 的正确模拟。仅找到一个具有合适类型的候选者(“b4”),因此请使用该候选者。 b3 错误地填充了模拟“b4”。
  4. 字段 b4 没有留下任何模拟,将保持为空(错误)。

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

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

(当然,fakeyMcFakeFake将在第二遍中注入(inject)到b1字段中,但至少其他字段将填充正确的mock)。但这真的能成为解决方案吗?有谁知道为什么没有更好地处理这个问题或如何更好地处理它?

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

最佳答案

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

虽然我喜欢 powermock,但我建议以一种不依赖于 powermock 的模拟测试的方式设计代码。

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

关于java - Mockito @InjectMocks 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34178380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com