在私有方法中模拟公共方法

时间:2020-07-13 06:35:51

标签: java unit-testing mocking mockito powermockito

我有一个类似如下的课程:

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这个类以及when(class2.method2).thenReturn()doReturn().when(class2).method2();,但是当我执行classOne.function1时,一切都调用了方法主体。我已经监视了ClassOne。

1 个答案:

答案 0 :(得分:1)

如果您还提供了无法使用的单元测试,那将非常有帮助。另一方面,我很确定问题仍然不存在:)

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

通常,在需要的地方(Class2)实例化依赖项(ClassOne)并不是一个好主意。如您现在所见,这使测试变得非常困难。 最好将依赖项传递给需要依赖的类。 这称为依赖注入(DI)。

在您的示例中,您将Class2的对象传递到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对象中,然后使用该对象。

相关问题