Java 从另一个类方法内部调用时无法正确模拟方法调用
Java 从另一个类方法内部调用时无法正确模拟方法调用,java,unit-testing,mockito,powermockito,Java,Unit Testing,Mockito,Powermockito,myFunction调用anotherFunction并返回anotherFunction的结果 但它并没有像我预期的那样返回1并打印“true”,相反,它仍然在发挥真正的功能 我错过了什么 在myFunction内创建另一个类的实例,然后使用该实例从myFunction内调用secondClass.anotherFunction 对。这意味着使用的是真实实例,而不是模拟实例。被测试的方法与依赖项紧密耦合,因为它自己创建了一个真实的实例 MyClass firstClass = PowerMoc
myFunction
调用anotherFunction
并返回anotherFunction
的结果
但它并没有像我预期的那样返回1
并打印“true
”,相反,它仍然在发挥真正的功能
我错过了什么
在myFunction内创建另一个类的实例,然后使用该实例从myFunction内调用secondClass.anotherFunction 对。这意味着使用的是真实实例,而不是模拟实例。被测试的方法与依赖项紧密耦合,因为它自己创建了一个真实的实例
MyClass firstClass = PowerMockito.spy(new MyClass());
AnotherClass secondClass;
secondClass = PowerMockito.mock(AnotherClass.class);
PowerMockito.when(secondClass.anotherFunction(Mockito.any()).thenReturn(1);
int myInt = firstClass.myFunction();
if (myInt == 1) {
System.out.println("true");
}
如何使用模拟实例?
您可以通过构造函数或方法参数重构第二个类,这是一个干净的代码设计,或者使用powermock模拟第二个类的初始化,我认为这是一个糟糕的设计
public class MyClass {
public int myFunction() {
AnotherClass secondClass = new AnotherClass();
int result = secondClass.anotherFunction(someValue);
//...
return result;
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)//
在myFunction内创建另一个类的实例,然后使用该实例从myFunction内调用secondClass.anotherFunction
对。这意味着使用的是真实实例,而不是模拟实例。被测试的方法与依赖项紧密耦合,因为它自己创建了一个真实的实例
MyClass firstClass = PowerMockito.spy(new MyClass());
AnotherClass secondClass;
secondClass = PowerMockito.mock(AnotherClass.class);
PowerMockito.when(secondClass.anotherFunction(Mockito.any()).thenReturn(1);
int myInt = firstClass.myFunction();
if (myInt == 1) {
System.out.println("true");
}
如何使用模拟实例?
您可以通过构造函数或方法参数重构第二个类,这是一个干净的代码设计,或者使用powermock模拟第二个类的初始化,我认为这是一个糟糕的设计
public class MyClass {
public int myFunction() {
AnotherClass secondClass = new AnotherClass();
int result = secondClass.anotherFunction(someValue);
//...
return result;
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)//第一个类中定义的第二个类在哪里?在myFunction内创建另一个类的实例,然后使用该实例从myFunction.Right内调用secondClass.anotherFunction。这意味着使用实例而不是模拟。你要么重构以注入第二个类,这是一个干净的代码设计,要么使用powermock来模拟第二个类的初始化,在我看来这是一个糟糕的设计。我的代码不是在模拟第二个类的初始化吗?为什么我的代码没有使用模拟的另一个函数,我如何让我的函数使用模拟的另一个函数而不是真实的函数?不,你模拟了一个实例,但不是在第一个类中使用的实例,因为第一个类自己创建了一个真实的实例。第二个类在第一个类中定义在哪里?在myFunction中创建另一个类的实例,然后使用该实例从myFunction.Right中调用secondClass.anotherFunction。这意味着使用实例而不是模拟。你要么重构以注入第二个类,这是一个干净的代码设计,要么使用powermock来模拟第二个类的初始化,在我看来这是一个糟糕的设计。我的代码不是在模拟第二个类的初始化吗?为什么我的代码没有使用模拟的另一个函数,我如何让我的函数使用模拟的另一个函数而不是真实的函数?不。你模拟了一个实例,但不是第一个类中使用的实例,因为第一个类自己创建了一个真实的实例。非常感谢!我错过了模拟第一个类中第二个类初始化的那一行。@abhishekSingh据我所知Mockito没有这个功能。这就是为什么使用了powermockity。通过mockito直接调用,如果我在调用时后跟return,它会给我结果。但从另一个类中,我正在调用某个方法,该方法在内部调用,就像在第一种情况下一样,然后它会给我null。我在想我们可以对间谍做同样的事吗@Nkosi@abhishekSingh遵循显式依赖原则并注入依赖项。尽量避免紧耦合,这个问题将不存在。非常感谢!我错过了模拟第一个类中第二个类初始化的那一行。@abhishekSingh据我所知Mockito没有这个功能。这就是为什么使用了powermockity。通过mockito直接调用,如果我在调用时后跟return,它会给我结果。但从另一个类中,我正在调用某个方法,该方法在内部调用,就像在第一种情况下一样,然后它会给我null。我在想我们可以对间谍做同样的事吗@Nkosi@abhishekSingh遵循显式依赖原则并注入依赖项。尽量避免紧耦合,此问题将不存在。