在嘲笑包私有抽象超类中的公共方法时,为什么实际的逻辑在运行



我正在为一个具有扩展包专用抽象超类的依赖项的类编写单元测试。设置类似于以下内容:

package pkg1;
public class ConcreteClass<T extends Something> extends AbstractClass<T> {
...
}
package pkg1;
abstract class AbstractClass<T extends Something> {
public AbstractClass() {
...
}
protected abstract Object unusedAbstractMethod() {
...
}
public T foo() {
// this method kicks off another sequence of calls into other classes before returning 
}
}
package pkg2;
@RunWith(MockitoJUnitRunner.class)
public class Test {
@Mock
private ConcreteClass<SomeClass> concreteClass;
@Test
public void test() {
when(concreteClass.foo()).thenReturn(someClass);
ClassUnderTest cut = new ClassUnderTest(concreteClass);
...
}

当执行行when(concreteClass.foo()).thenReturn(someClass);时,测试失败,并出现NullPointerException。从堆栈跟踪中,我可以看到foo((中的逻辑正在执行,NPE正在生成的调用堆栈的几层深处。为什么这个方法实际上是在我的mock上运行的,我如何才能适当地嘲笑它?

我认为你想要的嘲讽语法实际上不是:

when(concreteClass.foo()).thenReturn(someClass);

而是:

when(concreteClass).foo().thenReturn(someClass);

从你写的方式来看,就好像你在问";concreteClass.foo(("返回其类型被嘲笑的类。

假设concreteClass.foo((是您创建的某个实用程序类,它被实现为{return SomeType.class},那么当(concreteCClass.foo(((给您一个mock SomeType对象时。

最新更新