Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我使用doReturn(..)时,PowerMockito正在调用该方法_Java_Mockito_Powermockito - Fatal编程技术网

Java 当我使用doReturn(..)时,PowerMockito正在调用该方法

Java 当我使用doReturn(..)时,PowerMockito正在调用该方法,java,mockito,powermockito,Java,Mockito,Powermockito,我是PowerMockito的新手,它显示了一种我不理解的行为。以下代码解释了我的问题: public class ClassOfInterest { private Object methodIWantToMock(String x) { String y = x.trim(); //Do some other stuff; } public void methodUsingThePrivateMethod() { Object a = new O

我是PowerMockito的新手,它显示了一种我不理解的行为。以下代码解释了我的问题:

public class ClassOfInterest {

  private Object methodIWantToMock(String x) {

    String y = x.trim();

    //Do some other stuff;
  }

  public void methodUsingThePrivateMethod() {

    Object a = new Object();
    Object b = methodIWantToMock("some string");

    //Do some other stuff ...
  }
}
我有一个类,它包含一个我想模拟的私有方法,名为
methodIWantToMock(String x)
。在我的测试代码中,我将执行以下操作:

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassOfInterest.class)
public class ClassOfInterestTest {

  @Test
  public void someTestMethod() {

  ClassOfInterest coiSpy = PowerMockito.spy(new ClassOfInterest());

  PowerMockito.doReturn(null).when(coiSpy, "methodIWantToMock", any(String.class));

  coiSpy.methodUsingThePrivateMethod();

  //Do some stuff ...

  }
}

根据上面的代码,当我运行上面的测试时,只要在
方法内部调用
methodiWantomock
,PowerMockito就应该简单地返回一个null。然而,实际发生的情况是,当运行此命令时:
PowerMockito.doReturn(…)。当(…)
时,PowerMockito实际上正在调用
methodIWantToMock
它为什么这样做??在这个阶段,我只想指定在调用
coiSpy.methodUsingThePrivateMethod()时,当调用私有方法时,它应该如何模拟私有方法行已经运行。

所以我想出了一个适合我的解决方案。我没有使用
spy
,而是使用了
mock
,然后告诉PowerMockito在我的模拟对象中调用
methodUsingThePrivateMethod()
时调用real方法。它基本上做了与以前相同的事情,只是使用了
mock
而不是
spy
。这样,PowerMockito就不会调用我试图使用
PowerMockito.doReturn(…).when(…)
控制其行为的私有方法。这是我修改过的测试代码。我更改/添加的行被标记为:

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassOfInterest.class)
public class ClassOfInterestTest {

  @Test
  public void someTestMethod() {

  //Line changed:
  ClassOfInterest coiMock = PowerMockito.mock(new ClassOfInterest());

  //Line changed:
  PowerMockito.doReturn(null).when(coiMock, "methodIWantToMock", any(String.class));

  //Line added:
  PowerMockito.when(coiMock.methodUsingThePrivateMethod()).thenCallRealMethod();

  coiSpy.methodUsingThePrivateMethod();

  //Do some stuff ...

  }
}

您正在模拟对象上使用tePrivateMethod()
调用
方法,而模拟对象又在内部调用
methodiWantomock(“某些字符串”)
。您在这里期望的是什么行为?这是正确的,但是通过调试,我发现当我运行
doReturn().when()命令时,PowerMockito调用
methodIWantToMock()
。它不会等待
方法usingtheprivateMethod()
调用它。我通过调试发现了这种行为。如果我运行测试(不进行调试),测试会崩溃,因为当
doReturn(…)时会生成
NullPointerException
。当执行(…)
命令时,PowerMockito会在传递
null
作为输入的同时运行私有方法,当
字符串y=x.trim()时也是如此
方法内部执行,使用pPrivateMethod()
,将生成
NullPointerException
。底线===命令
coiSpy.methodUsingThePrivateMethod()。对于此行:PowerMockito.doReturn(null)。when(coiMock,“methodIWantToMock”,any(String.class));//coiMock不能调用methodIWantToMock,对吗?