java - Mockito 中的可选 stub

标签 java mockito stub

我想在测试类的父类(super class)中创建一个方法,该方法可以在测试类中 stub 一些常用的方法,但其中一些方法可能不存在。

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

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(生成骨架的工具)有大量子类,因此我想创建一个父类(super class)以方便我测试:

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() 之前, stub getFoo()。哦,如果子类碰巧有 getBar() >,也 stub 它。” 但我不能这样做,因为它会抛出org.powermock.reflect.exceptions.MethodNotFoundException。如何做到这一点?

最佳答案

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

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

关于java - Mockito 中的可选 stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7514116/

相关文章:

java - 如何在junit测试用例中使用 'MOCKITO_CORE when'传递void返回类型

ruby - rspec 中的 double 方法有什么用?

c - 函数插入,标记 C 函数总是使用符号 stub 而不是直接调用

windows - Windows的lua "stub"dll的用途是什么

java - 如何在 Activity 类中启用 xml Button?

在 native 代码中创建的未命名管道的 Java 输入/输出流?

java - Autowiring 类的 Mockito 3 模拟方法

java - JSON 到 Java 中的对象?

java - 同步器困惑

java - 模拟java中函数的输入