繁体   English   中英

Mocking 私有方法中的公共方法

[英]Mocking public method inside a private method

我有一个 class 如下所示:

public class ClassOne {

    public function1(input, output, context) {
        //some implementation

        private function2(List, String, String);
    } 
    
    private void function2(List, String, String){
        Class2 class2 = new Class2();
        String value = class2.method1(string, string);
    }
}

public Class2 {
    public String method2(string, string) {
        //some implementation
        return string;
    }
}

我正在使用 Mockito 和 PowerMockito 为 ClassOne 编写单元测试,并且想模拟对 class2 的调用,并且不想实际调用 method2 的方法主体。 我怎样才能做到这一点?

我试过 Mockito.mock 和 PowerMockito.spy class 和when(class2.method2).thenReturn()doReturn().when(class2).method2(); 但是当我做classOne.function1时,一切都会调用方法体。 我发现了 ClassOne。

如果您还提供了非工作单元测试,那将非常有帮助。 另一方面,我很确定问题不存在:)

您的问题不是 Mockito 和 PowerMockito 不起作用。 真正的问题在于你的类的依赖性。 或者更具体地说,您的类处理这种依赖关系的方式。

一般来说,在需要的地方( ClassOne )实例化依赖项( Class2 )并不是一个好主意。 正如您现在所看到的,它使测试变得非常困难。 最好将依赖项传递到需要它的 class 中。 这称为依赖注入(DI)。

在您的示例中,您会将Class2的 object 传递给 ClassOne 的构造ClassOne 代码看起来像这样:

public class ClassOne {

    private final Class2 class2;

    public ClassOne(Class2 class2) {
        this.class2 = class2;
    }

    ...
    
    private void function2(List, String, String){
        String value = class2.method1(string, string);
    }
}

如您所见,您只需传递一个依赖项实例并使用它,而不是自己创建它。

在您的单元测试中,您现在可以将Class2的 Mock 传递到您的Class1 object 中,然后将使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM