Опциональная заглушка в Мокито - PullRequest
0 голосов
/ 22 сентября 2011

Я хочу создать метод в суперклассе класса test, который заглушает некоторые часто используемые методы в классах под тестом, но некоторые из этих методов могут не существовать.

Например, у меня есть иерархия классовкак это:

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 Ответ

2 голосов
/ 22 сентября 2011

Используйте отражение, чтобы определить, реализован ли класс.

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){}
...