gpt4 book ai didi

java - 如何使用 Powermock 和 Mockito 模拟通过私有(private)构造函数初始化的私有(private)静态最终字段?

转载 作者:行者123 更新时间:2023-11-30 06:52:09 25 4
gpt4 key购买 nike

这是我的源类 -

public class ClassToTest extends AbstractSuperClass<Integer> {
private static final ClassToTest INSTANCE = new ClassToTest(); // (line 1) need to mock this variable

static ClassToTest get() {
return INSTANCE;
}
private ClassToTest() {
super(Integer.class);// (line 2)
}
}

这是我到目前为止的测试尝试

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassToTest.class)
public class TestClass {
private ClassToTest testClass;
@Before
public void setUp() {
// each of the below attempts fails at line 1 because of the call to line 2 (annotated above).
// Attempt A.
testClass = WhiteBox.newInstance(ClassToTest.class);
//Attempt B.
testClass = mock(ClassToTest.class);
WhiteBox.setInternalState(ClassToTest.class, "INSTANCE", testClass);
}
@Test
public void dummy() {
// irrelevant
}
}

我正在尝试有效地模拟 ClassToTest.INSTANCE 并调用其私有(private)构造函数。我怎么能那样做?

编辑:从 AbstractSuperClass 调用的片段/构造函数。

public abstract class AbstractSuperClass<V extends Serializable> {
private final CacheClient<V> cache;
private final int seconds;

public AbstractSuperClass(Class<V> valueType) {
cache = new ClientFactory(Config.getAppConfig(), StatisticSet.getGlobalStatistics()).newClient(getCacheType(), valueType);
seconds = Config.getAppConfig().get(getCacheType().getSectionEnum()).getSeconds();
}

P.S:我试图远离处理 AbstractSuperClass 的内部结构,最初希望简单地模拟调用。我也愿意接受重构 ClassToTest 以避免这种情况的任何想法。

最佳答案

您的真正问题是您通过使用static 创建了困难的、几乎不可测试的代码。不仅如此:您还创建了糟糕的设计。因为您将生产类彼此紧密耦合。一旦到位,以后将很难摆脱该静态方法。

因此,另一种选择是:与其尝试使用 PowerMock 来“修复”损坏的设计,不如退后一步。您了解“编写可测试”代码实际上是关于什么的(例如通过观看这些 videos );然后你使用纯接口(interface)和依赖注入(inject)来解决你的问题。您可以使用 EasyMock 或 Mockito 测试所有这些,而无需 Powermock!

关于java - 如何使用 Powermock 和 Mockito 模拟通过私有(private)构造函数初始化的私有(private)静态最终字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39428940/

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