【发布时间】:2016-09-10 17:51:54
【问题描述】:
这是我的源类 -
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 并调用它的私有构造函数。我怎么能那样做?
编辑:从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 以避免这种情况的想法。
【问题讨论】:
-
您模拟
ClassToTest.INSTANCE接缝工作的解决方案,如果您将testClass.doSomething(); verify(testClass).doSomething();添加到dummy方法,那么测试通过了,所以我看不出真正的问题是什么(我使用尝试 B)。您能否就问题所在添加更多信息? -
@GergelyToth - 我猜这可能与私有构造函数对
AbstractSuperClass的调用有关,我已经编辑了问题并添加了该类的更多详细信息。 -
我很想知道使用 Mockito/PowerMock 是否有解决此问题的方法。在我的情况下,我希望测试另一个具有
ClassToTest作为依赖项的类,所以我基本上将ClassToTest提取到一个接口并提供了一个模拟实现以供测试,类似于 here的解释>
标签: java unit-testing mockito powermock white-box