java - Mockito - 模拟子类方法调用

标签 java unit-testing mockito

我正在使用遗留代码并尝试为我所做的实现编写单元测试。我有以下结构:

   AbstractClass:
    ----------------

    public AbstractClass {

    abstract method2();

     void method1(){   
      ...does something...
      ..calls --> method2()
     }
    }

    Subclass
    ------------
    public Subclass extends AbstractClass(){

     void method2(){
      ..do something....
      ..mockThisMethod()...

       return true;   
     }
 }

我有一个抽象类,它有一些在特定方法中实现的逻辑。 此方法调用子类中实现的另一个方法。子类中的方法调用我想模拟的其他方法。

这是否可以在不更改实现代码的情况下实现(很难更改)? 大多数结果都建议使用 mockito spy ,但它不起作用。

我在这里遵循了 TestDesign 描述符:

https://www.tildedave.com/2011/03/06/pattern-stubbing-legacy-superclasses-with-mockito-spies.html

我做的是:

 Subclass subclass= spy(Subclass.class);
 when(subclass.mockThisMethod()).thenReturn(something);
 subclass.method1() (I am not sure if this line is correct?)

所以我想避免的是,调用 Subclass 中的方法 (mockThisMethod)。 由于此方法执行一些 db-stuff 等等。我知道如果我使用对象组合而不是继承会更容易测试,但在这一点上,很难改变整个实现。上面的代码不工作..我得到一个 NPE。

最佳答案

1) 您不会通过将类传递给静态 Mockito.spy 方法来创建 Spy。 相反,您必须传递该特定类的实例:

Subclass subclassSpy = spy(new Subclass());

另外,考虑使用注解:

@Spy
private Subclass subclassSpy = new Sublcass();

@Before
public void init(){
   MockitoAnnotations.initMocks(this);
}

2) 阻止 spy 时避免使用 when.thenReturn。 相反,使用 doReturn..when..methodCall:

doReturn(something).when(sublcass).mockThisMethod(); 

否则您将在 stub 时调用实际方法,这可能会导致不需要的行为和/或异常。

关于java - Mockito - 模拟子类方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47264811/

相关文章:

c++ - 如何为网络客户端编写单元测试?

java - 如何测试更新方法?

java - 如何模拟从另一个方法调用的方法

java - 如何 JUnit 测试我的模拟方法是否使用我想要的参数(不仅仅是 id,而是深度相等匹配器)调用?

java - Mockito:Java - 未完成的 stub 检测

java - 我想知道如何将java中的这个由星号组成的城市旋转90度(所以它实际上看起来像一个城市)

java - 无法在 docker 镜像中安装 RWeka 包

java - 关于 Cglib MethodInterceptor 调用方法的困惑

Java错误找不到符号类Scanner.using jdk 6

c++ - 私有(private)方法的单元测试