我有一个抽象类,比如说AbstractClass
我有一个没有实现的公共 void 方法myMethod
。在测试这个类时,我创建了一个匿名子类,我可以在其中实现我认为合适的myMethod
。在AbstractClass
中还有另一种方法,比如说myImplementedMethod
调用myMethod
。有什么技巧可以让我在匿名子类中放入myMethod
,以便能够验证它是否已被调用?
编辑:我正在使用Mockito进行嘲笑,这不是我使用另一个框架的地方。
public abstract class AbstractClass {
public abstract void myMethod();
public void myImplementedMethod() {
myMethod();
}
public class AbstractClassTest {
@Before
public void setUp() {
AbstractClass myClass = new AbstractClass() {
@Override
public void myMethod(){
//What could I put here?
}
}
}
@Test
public void testMyImplementedMethod() {
myClass.myImplementedMethod();
//check that myMethod is called.
}
}
如果Mockito的间谍对你有用,那就太好了。但是我不相信它会捕获内部方法调用。下面怎么样...
public class AbstractClassTest {
boolean methodCalled = false;
@Before
public void setUp() {
methodCalled = false;
AbstractClass myClass = new AbstractClass() {
@Override
public void myMethod(){
methodCalled = true;
}
}
}
@Test
public void testMyImplementedMethod() {
assertFalse(methodCalled);
myClass.myImplementedMethod();
assertTrue(methodCalled);
}
}
您可以在后代类上创建一个间谍对象,调用已实现的方法,然后确保使用verify
调用未实现的方法
AbstractClass myInstance= Mockito.spy(myClass);
myInstance.myImplementedMethod();
Mockito.verify(myInstance).myMethod();
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
public class AbstractClassTest {
private AbstractClass myClass;
@Before
public void setUp() {
AbstractClass instance = new AbstractClass() {
@Override
public void myMethod(){}
}
myClass = spy(instance);
}
@Test
public void testMyImplementedMethod() {
myClass.myImplementedMethod();
verify(myClass).myMethod();
}
}
你不能像这样使用反射 API
YourClass.getClass().getMethod("myMethod").invoke(obj,args); // pass the appropriate parameters
如果这引发异常,则您尚未实现该方法。我自己没有尝试过这个,如果它有效,请发表评论。