gpt4 book ai didi

java - 模拟抽象类并使用 Mockito 注释注入(inject)类?

转载 作者:行者123 更新时间:2023-12-01 23:08:28 27 4
gpt4 key购买 nike

是否可以模拟一个抽象类并使用 Mockito 注释将其注入(inject)模拟类。我现在有以下情况:

@Mock private MockClassA mockClassA;
@Mock private MockClassB mockClassB;

@Mock(answer = Answers.CALLS_REAL_METHODS) private AbstractClassUnderTest abstractClassUnderTest;

@Before
public void init() {
MockitoAnnotations.initMocks(this);
Whitebox.setInternalState(abstractClassUnderTest, mockClassA);
Whitebox.setInternalState(abstractClassUnderTest, mockClassB);
}

我想在 AbstractClassUnderTest 上使用 @InjectMocks 之类的东西,但它不能与 @Mock 结合使用。目前的情况,使用 Powermock 的 Whitebox 是可行的,但我很好奇是否有可能只用注释来解决它。我找不到任何解决方案或示例。

(我知道测试抽象类的反对意见,我个人宁愿测试一个具体的实现,只使用@InjectMocks。)

最佳答案

我不知道有什么方法可以解决这个问题,原因很明显:@InjectMocks 用于测试中的非模拟系统,@Mock 用于模拟协作者,而 Mockito 不是为任何类设计的来填充这两个在同一个测试中的角色。

请记住,您的 @Mock(CALLS_REAL_METHODS)声明是 inherently dangerous :您正在测试您的 AbstractClassUnderTest,但您没有运行任何构造函数或初始化任何字段。我不认为你可以期望这个设计的测试是现实的或健壮的,不管注释可以或不能为你做什么。 (就个人而言,我以前赞成将抽象类的真实部分模拟作为“工具箱中的工具”,但我开始认为它们与现实相去甚远而无用。)

如果我处于你的位置,我会创建一个小的覆盖实现来进行测试:

@RunWith(JUnit4.class) public class AbstractClassTest {
/** Minimial AbstractClass implementation for testing. */
public static class SimpleConcreteClass extends AbstractClass {
public SimpleConcreteClass() { super("foo", "bar", 42); }
@Override public void abstractMethod1() {}
@Override public String abstractMethod2(int parameter) { return ""; }
}

@InjectMocks SimpleConcreteClass classUnderTest;
@Mock mockClassA;
@Mock mockClassB;
}

此时,您已经有了一个简单且可预测的 AbstractClass 实现,如果您只是想测试 AbstractClass 是否具有与以前相同的扩展 API,即使没有模拟框架也可以使用它。 (这是一个经常被忽略的抽象类测试。)你甚至可以提取它,因为它可能对其他测试有用:如果你想覆盖单个测试类的抽象行为,你可以创建一个匿名内部类只需一个方法覆盖,或者您可以设置 classUnderTest = spy(classUnderTest);设置 Mockito 代理和您想要的行为。

(请记住,@InjectMocks 和 @Spy 不能可靠地一起使用,如 this GitHub issue 及其链接的 Google 代码和邮件列表线程中所述。)

关于java - 模拟抽象类并使用 Mockito 注释注入(inject)类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34994351/

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