【问题标题】:Optional stubbing in MockitoMockito 中的可选存根
【发布时间】:2011-09-22 11:37:23
【问题描述】:

我想在测试类的超类中创建一个方法,将一些常用方法存根在被测类中,但其中一些方法可能不存在。

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

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。如何做到这一点?

【问题讨论】:

  • 你为什么不把它转换成C?我假设 A B 和 C 都是模拟。 when((C)undertest.getBar).thenReturn("Bar");
  • 我无法转换,因为代码在超类中(即由 B、C、D 等测试类共享)。

标签: java mockito stub


【解决方案1】:

使用反射来判断类是否被实现。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-30
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多