在抽象类中测试未实现的方法

时间:2014-12-04 16:00:13

标签: java junit abstract-class mockito

我有一个抽象类,比如说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.
    }
}

4 个答案:

答案 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

如果这会引发异常,那么你还没有实现该方法。 我自己没有尝试过,如果有效,请做评论。