Mockito中的可选存根

时间:2011-09-22 11:37:24

标签: java mockito stub

我想在test-class的超类中创建一个方法,它在under-test-classes中存根一些常用的方法,但其中一些方法可能不存在。

例如,我有一个类层次结构:

abstract class A {
    void search(); // implemented by subclass

    String getFoo() { return "REAL FOO"; }
}

class B extends A {
    void search() {
        getFoo();
    }   
}

class C extends A {
    void search() {
        getFoo();
        getBar();
    }   

    String getBar() { return "REAL BAR"; }
}

A有很多子类(一个工具生成骨架)因此我想创建一个超类来让我更容易测试:

abstract class AbstractSearchTest {
    A underTest;

    @Test void test() {
        doReturn( "FOO" ).when( underTest ).getFoo();
        doReturn( "BAR" ).when( underTest, "getBar" ); // THE PROBLEM!

        underTest.search();
    }
}

class BSearchTest extends AbstractSearchTest {
    BSearchTest() {
        underTest = new B();
    }
}

class CSearchTest extends AbstractSearchTest {
    CSearchTest() {
        underTest = new C();
    }
}

其中基本上说,“在调用search()之前,存根getFoo()。哦,如果子类碰巧有getBar(),那么也将其存根。” 但我不能这样做,因为它会抛出 org.powermock.reflect.exceptions.MethodNotFoundException 。怎么做?

1 个答案:

答案 0 :(得分:2)

使用反射来确定该类是否已实现。

try{
    Method m = underTest.getClass().getMethod("getBar");
    // no exception means the method is implememented
    // Do your mocking here
    doReturn( "BAR" ).when( underTest, "getBar" );
}catch(NoSuchMethodException e){}