gpt4 book ai didi

java - 使用模拟构造函数参数模拟抽象类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:14:10 25 4
gpt4 key购买 nike

我想使用 Mockito 对抽象类进行单元测试,详见 great answer.

诀窍在于,抽象类依赖于注入(inject)其构造函数的策略。我已经创建了该策略的模拟,并且我希望我的模拟 BaseClass 实例将模拟策略用于我的单元测试。

关于如何连接它有什么建议吗?我目前没有使用任何 IoC 框架,但正在考虑使用 Spring。也许它可以解决问题?

// abstract class to be tested w/ mock instance
abstract BaseClass
{
// Strategy gets mocked too
protected BaseClass( Strategy strategy)
{
...
}
}

更新:
根据 Mockito 邮件列表,目前没有一种方法可以将参数传递给模拟的构造函数。

最佳答案

我最终只是使用反射在我的基类中设置了一个私有(private)字段,如下所示:

// mock the strategy dependency
Strategy strategyMock = mock( Strategy.class);
when(....).thenReturn(...);

// mock the abstract base class
BaseClass baseMock = mock(BaseClass.class, CALLS_REAL_METHODS);

// get the private streategy field
Field strategyField = baseMock.getClass().getSuperclass().getDeclaredField("_privateStrategy");

// make remove final modifier and make field accessible
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(strategyField, strategyField.getModifiers() & ~Modifier.FINAL);
strategyField.setAccessible(true);

// set the strategy
strategyField.set(baseMock, strategyMock);

// do unit tests with baseMock
...

如果私有(private)字段的名称发生变化,它就会中断,但它已被注释,我可以接受。这很简单,它是一行代码,我发现这比在我的测试中公开任何 setter 或必须显式子类化更可取。

编辑:所以它不再是一行代码,因为我的私有(private)字段需要是“最终的”,需要一些额外的反射代码才能解决。

关于java - 使用模拟构造函数参数模拟抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10182442/

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