在私有方法中模拟 public 方法
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 的调用并且不想实际调用方法 2 的方法主体。我怎样才能做到这一点?
我试过 Mockito.mock 和 PowerMockito.spy class 和 when(class2.method2).thenReturn()
和 doReturn().when(class2).method2();
但是当我做 classOne.function1
时一切都调用方法体.我发现了 ClassOne。
如果您还提供了非工作单元测试,那将非常有帮助。另一方面,我很确定问题不存在:)
您的问题不是 Mockito 和 PowerMockito 不工作。
真正的问题在于你们 classes 的依赖。或者更具体地说,您的 classes 处理这种依赖关系的方式。
一般来说,在需要它的地方(ClassOne
)实例化依赖(Class2
)不是一个好主意。正如您现在所见,它使测试变得非常困难。
最好将依赖项传递给需要它的 class 。
这称为 依赖注入 (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
对象中,然后将使用该对象。
我有一个 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 的调用并且不想实际调用方法 2 的方法主体。我怎样才能做到这一点?
我试过 Mockito.mock 和 PowerMockito.spy class 和 when(class2.method2).thenReturn()
和 doReturn().when(class2).method2();
但是当我做 classOne.function1
时一切都调用方法体.我发现了 ClassOne。
如果您还提供了非工作单元测试,那将非常有帮助。另一方面,我很确定问题不存在:)
您的问题不是 Mockito 和 PowerMockito 不工作。 真正的问题在于你们 classes 的依赖。或者更具体地说,您的 classes 处理这种依赖关系的方式。
一般来说,在需要它的地方(ClassOne
)实例化依赖(Class2
)不是一个好主意。正如您现在所见,它使测试变得非常困难。
最好将依赖项传递给需要它的 class 。
这称为 依赖注入 (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
对象中,然后将使用该对象。