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遵循显式依赖原则并注入依赖项。尽量避免紧耦合,此问题将不存在。