Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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 从测试类以外的类执行存根时出现UnfinishedStubbingException_Java_Unit Testing_Powermock_Powermockito - Fatal编程技术网

Java 从测试类以外的类执行存根时出现UnfinishedStubbingException

Java 从测试类以外的类执行存根时出现UnfinishedStubbingException,java,unit-testing,powermock,powermockito,Java,Unit Testing,Powermock,Powermockito,我正在使用PowerMock模拟java.net.Inet4Address(以及其他内容),以返回特定的IP地址(getHostAddress()),以及它是否是环回(isLoopbackAddress())。我发现如果我在测试类或直接内部类之外的任何地方执行实际的stubing(PowerMock.doReturn(…).when(mock.methodToStub()),我会得到一个未完成的stubging异常 如果我尝试执行两个存根,问题最明显。第一个进程通过时没有异常,但是第二个进程抛出

我正在使用PowerMock模拟java.net.Inet4Address(以及其他内容),以返回特定的IP地址(
getHostAddress()
),以及它是否是环回(
isLoopbackAddress()
)。我发现如果我在测试类或直接内部类之外的任何地方执行实际的stubing(
PowerMock.doReturn(…).when(mock.methodToStub()
),我会得到一个未完成的stubging异常

如果我尝试执行两个存根,问题最明显。第一个进程通过时没有异常,但是第二个进程抛出异常,因为它认为第一个进程没有完成。如果我只执行一个存根,那么我会看到不同的错误,这取决于我在那之后做了什么,所以肯定是第一个存根导致了问题

下面是一些演示该问题的代码

TestClass.java

/*包,导入*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({Inet4Address.class})
公共类TestClass{
@试验
公开无效测试(){
Inet4Address mocked=PowerMockito.mock(Inet4Address.class);
//选项1:在这个类中执行-有效
配药(模拟);
//选项2:从一个内部类执行-WORKS
内部。配药管(模拟);
//选项3:从内部类的内部类执行-失败
内。深。配药(模拟);
//选项4:从一个完全不同的类执行-失败
其他类别。配药(模拟);
}
私有void dostubing(Inet4Address模拟){
doReturn(true).when(mocked.isLoopbackAddress();
PowerMockito.doReturn(“127.0.0.1”).when(mocked.getHostAddress();
}
公共静态类内部{
静态无效剂量管(Inet4Address模拟){
doReturn(true).when(mocked.isLoopbackAddress();
PowerMockito.doReturn(“127.0.0.1”).when(mocked.getHostAddress();
}
公共静态类{
静态无效剂量管(Inet4Address模拟){
doReturn(true).when(mocked.isLoopbackAddress();
PowerMockito.doReturn(“127.0.0.1”).when(mocked.getHostAddress();
}
}
}
}
OtherClass.java

/*包,导入*/
公共类其他类{
公共静态无效Dostubing(Inet4Address模拟){
doReturn(true).when(mocked.isLoopbackAddress();
PowerMockito.doReturn(“127.0.0.1”).when(mocked.getHostAddress();
}
}
我已经将模拟的创建放在了一开始,这对于所有场景都是通用的。如果mock是从执行stubing的同一类中创建的,则没有区别。为了便于阅读,我还将这些方法设置为静态;如果先实例化类,则行为相同

我知道有一些变通方法可以让我的测试正常工作(在测试类中执行模拟,模拟InetAddress接口而不是IPv4实现,等等),但我想知道为什么PowerMock会以这种方式运行。如果它只在测试类中工作,我几乎可以理解它,但是为什么它也在内部类中工作呢