首页 > 解决方案 > 验证是否通过反射调用了常规(非模拟)对象的方法

问题描述

我的代码如下所示:

abstract class Parent {
   public void dispatch(...) { ... }
}

方法的工作dispatch就是根据参数的值来判断应该调用子类的哪个方法,然后调用它;这是通过运行时注释分析完成的。所以,如果我有一个看起来像这样的子类:

class Child extends Parent {
    @CallThisMethodIfA
    public Thing aMethod(...) { ... }

    @CallThisMethodIfB
    public Thing bMethod(...) { ... }
}

然后调用child.dispatch(A)应该调用aMethod(其中child的一个实例Child)。当然,我在这里尽可能地简化——这些不是我拥有的实际注释和参数。

我的问题是如何测试这种行为。我试过类似的东西:

Child child = new Child(...);
child.dispatch(A);
verify(child, times(1)).aMethod(...)

这给了我一个NotAMockException因为,当然,child不是一个模拟,而是一个真实的对象。我不是 100% 确定间谍是如何工作的,但我也尝试过实例化Childusing @Spy,虽然这没有引发异常,但它也没有注册调用,aMethod因为我猜,间谍实际上并没有模仿类的内部行为。我该怎么做呢?我想我可以手动初始化ChildaMethod返回一个非常具体的实例,Thing然后我可以检查它,但这对我来说并不干净(如果其他方法恰好返回一个相等的实例怎么办?)

标签: javatestingreflectionjunitmockito

解决方案


推荐阅读