当前位置: 首页 > 知识库问答 >
问题:

模拟继承保护方法

桑宇
2023-03-14

我这里有我的问题的简化版本。A类有一个受保护的方法。类B继承了这个方法。

public class A{
    protected String getString(){
        //some Code
    }
}


public class B extends A{
    public void doSomething(){
        //someCode
        String result = getString();
    }
}

我现在用Mockito编写一个单元测试,它在另一个包测试中,我想测试doSomething()方法。为此,我需要模拟getString()调用。由于该方法受到保护,并且我的测试类位于不同的包中,所以我不能使用doReturn(…)。当(被测类别)。getString()。问题是,我监视类B。所以我不能使用mock(new B(),Mockito)。调用_REAL_METHODS)

我尝试通过反射获得受保护的方法:

Method getString = classUnderTest.getClass().getDeclaredMethod("getString");
getString.setAccessible(true);

但是我不知道如何在do返回()中使用这个。

共有3个答案

萧远
2023-03-14

像下面这样的东西对我来说很有用,使用了do返回()和Junit5的反射支持。

[注:我在Mockito 3.12.4上进行了测试]

var a = spy(new A);
ReflectionSupport.invokeMethod(
        a.getClass().getSuperclass().getDeclaredMethod("getString"),
        doReturn("FAKE VALUE FOR TESTING PURPOSES").when(a));
刘辰钊
2023-03-14

也许有一种更干净的方法,但现在。。。

  1. 为“a”创建一个模拟
  2. 创建另一个扩展B并重写该方法的类
  3. 使被重写的方法调用mock

例如...

private A partialMock;
private B classUnderTest;

@Before
public void setup() {
    partialMock = mock(A.class);
    classUnderTest = new B() {
        @Override
        protected String getString() {
            return partialMock.getString();
        }
    };
}

@Test
public void shouldDoSomething() {

    when(partialMock.toString()).thenReturn("[THE MOCKED RESPONSE]");

    classUnderTest.doSomething();

    // ...verify stuff...
}

显然,你甚至不需要使用mock,你可以直接从重写的方法返回一些东西。

邓毅
2023-03-14

您可以使用覆盖和子类

B b = new B() {
  @Override
  protected String getString() {
    return "FAKE VALUE FOR TESTING PURPOSES";
  };
};
 类似资料:
  • FAQs in section [24]: [24.1] 如何表示“私有继承”? [24.2] 私有继承和组合(composition)有什么类似? [24.3] 我应该选谁:组合还是私有继承? [24.4] 从私有继承类到父类需要指针类型转换吗? [24.5] 保护继承和私有继承的关系是什么? [24.6] 私有继承和保护继承的访问规则是什么? 24.1 如何表示“私有继承”? 用 : priv

  • 问题内容: 我想模拟一个继承的受保护方法。我不能直接从Java代码中调用此方法,因为它是从另一个包中的类继承的。我找不到指定此方法存根的方法 我查看了重写,这似乎它们仅用于私有方法! 如何指定保护方法? 问题答案: 果壳:不能总是用来对间谍进行打桩;使用。 假设静态导入和(两者): 您也可以设置on 。哪个更有意义取决于实际测试。

  • 如何使用Mockito或PowerMock模拟一个由子类实现,但从抽象超类继承的受保护方法? 换句话说,我想测试“DoSomething”方法,同时嘲弄“DoSomethingElse”。 抽象超类 子类实现 解决方案 这里给出的答案是正确的,如果涉及的类是在同一包中,将会起作用。 但如果涉及不同的包,一个选择是使用PowerMock。下面的例子对我有效。当然可能有其他的方法,这是一个可行的。 注

  • 本文向大家介绍JavaScript模拟实现继承的方法,包括了JavaScript模拟实现继承的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript模拟实现继承的方法。分享给大家供大家参考。具体分析如下: 我们都知道,在JavaScript中只能模拟实现OO中的"类",也就意味着,在JavaScript中没有类的继承。我们也只能通过在原对象里添加或改写属性来模拟实现。 先

  • 本文向大家介绍C/C++ 公有继承、保护继承和私有继承的对比详解,包括了C/C++ 公有继承、保护继承和私有继承的对比详解的使用技巧和注意事项,需要的朋友参考一下 C/C++ 公有继承、保护继承和私有继承的区别    在c++的继承控制中,有三种不同的控制权限,分别是public、protected和private。定义派生类时,若不显示加上这三个关键字,就会使用默认的方式,用struct定义的类

  • 人们经常会问AspectJ这样的问题,所以我想在以后可以轻松链接到的地方回答。 我有这个标记注释: 现在我像这样注释接口和/或方法: 这是一个小驱动程序应用程序,它也实现了接口: 现在当我定义这个方面时,我希望它被触发 对于带注释类的每个构造函数执行和 每次执行带注释的方法。 不幸的是,方面没有打印任何内容,就像类