可能重复:
使用Mockito测试抽象类
我有一个抽象类,其中包含我需要测试的功能。我可以创建该类的简单派生,而不需要抽象方法的操作实现,但有可能使用mocking框架吗?我需要维护类的内部状态,所以我不能只调用
mockedInstance = mock(ClassUnderTest.class);
我需要
mockedInstance = spy(new ClassUnderTest(...));
但显然这是不可能做到的,因为类是抽象的。
当我想单元测试一个我不模拟的抽象类时,我会给它子类。
在其他应答中从mijer借用代码
public class MockitoTest {
public static abstract class MyAbstractClass {
private int state;
public abstract int abstractMethod();
public int method(....)
{
...
}
}
}
class Testclass extends MyAbstractClass
{
public int abstractMethod()
{
...
}
}
然后使用Testclass的实例运行MyAbstractClass的测试。您可以控制本地子类中抽象方法的实现。
import org.junit.Test;
import org.mockito.internal.stubbing.answers.CallsRealMethods;
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
public class MockitoTest {
public static abstract class MyAbstractClass {
private int state;
public abstract int abstractMethod();
public void method() {
System.out.println("method. State: " + (++state));
System.out.println("abstractMethod: " + abstractMethod());
anotherMethod();
}
public void anotherMethod() {
System.out.println("anotherMethod. State: " + (++state));
}
}
@Test
public void test() throws Exception {
MyAbstractClass obj = mock(MyAbstractClass.class, new CallsRealMethods());
doReturn(5).when(obj).abstractMethod();
obj.method();
verify(obj).abstractMethod();
assertEquals(2, obj.state);
}
}
-编辑-
如果您需要维护对象的内部状态,则必须使用
org.mockito.internal.util.reflection.Whitebox.setInternalState
,例如:@Test public void test() throws Exception { MyAbstractClass obj = mock(MyAbstractClass.class, new CallsRealMethods()); setInternalState(obj, "state", 100); doReturn(5).when(obj).abstractMethod(); obj.method(); verify(obj).abstractMethod(); assertEquals(102, obj.state); }
如果你有一个抽象类,它的构造函数中有一个复杂的逻辑,你想测试它,你应该扩展这个类,只是为了测试或重构你的类,把所有的逻辑转移到某个要测试的方法。