我有一个抽象类,比如说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.
}
}
答案 0 :(得分:2)
您可以在后代类上创建一个间谍对象,调用已实现的方法,然后确保使用verify
AbstractClass myInstance= Mockito.spy(myClass);
myInstance.myImplementedMethod();
Mockito.verify(myInstance).myMethod();
答案 1 :(得分:2)
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();
}
}
答案 2 :(得分:2)
如果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);
}
}
答案 3 :(得分:0)
你不能像这样使用反射api
YourClass.getClass().getMethod("myMethod").invoke(obj,args); // pass the appropriate parameters
如果这会引发异常,那么你还没有实现该方法。 我自己没有尝试过,如果有效,请做评论。