wiradikusuma
wiradikusuma

Reputation: 1909

Optional stubbing in Mockito

I want to create a method in superclass of test-class that stubs some commonly used methods in under-test-classes but some of those methods might not exist.

For example, I have a class hierarchy like this:

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"; }
}

There are tons of subclasses of A (a tool generated the skeleton) thus I want to create a superclass to make it easier for me to test:

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();
    }
}

Which basically says, "Before invoking search(), stub getFoo(). Oh, if the subclass happen to have getBar(), stub it too." But I can't do that since it'll throw org.powermock.reflect.exceptions.MethodNotFoundException. How to do this?

Upvotes: 0

Views: 1256

Answers (1)

John B
John B

Reputation: 32949

Use reflection to determine if the class is implemented.

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

Upvotes: 2

Related Questions