我这里有我的问题的简化版本。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返回()
中使用这个。
像下面这样的东西对我来说很有用,使用了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));
也许有一种更干净的方法,但现在。。。
例如...
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,你可以直接从重写的方法返回一些东西。
您可以使用覆盖和子类
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这样的问题,所以我想在以后可以轻松链接到的地方回答。 我有这个标记注释: 现在我像这样注释接口和/或方法: 这是一个小驱动程序应用程序,它也实现了接口: 现在当我定义这个方面时,我希望它被触发 对于带注释类的每个构造函数执行和 每次执行带注释的方法。 不幸的是,方面没有打印任何内容,就像类