Java 无法使用PowerMockito测试URL

Java 无法使用PowerMockito测试URL,java,spring-boot,junit,mockito,powermock,Java,Spring Boot,Junit,Mockito,Powermock,不幸的是,我在这里读到了一些问题和解决方案 我正在测试一个Spring启动应用程序,并试图用PowerMockito在测试用例中模拟URL对象,但它对我不起作用,当我想模拟openConnection()方法时,它会抛出一个AbstractMethodError java.lang.AbstractMethodError at java.net.URL.openConnection(Unknown Source) at -(UrlExampleTest class)-

不幸的是,我在这里读到了一些问题和解决方案

我正在测试一个Spring启动应用程序,并试图用PowerMockito在测试用例中模拟URL对象,但它对我不起作用,当我想模拟
openConnection()
方法时,它会抛出一个
AbstractMethodError

java.lang.AbstractMethodError
    at java.net.URL.openConnection(Unknown Source)
    at -(UrlExampleTest class)- 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:532)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:171)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:167)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:114)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:59)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$4(NodeTestTask.java:108)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:98)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:74)
    at java.util.ArrayList.forEach(Unknown Source)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$4(NodeTestTask.java:112)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:98)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:74)
    at java.util.ArrayList.forEach(Unknown Source)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$4(NodeTestTask.java:112)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:98)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:74)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
    at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
    at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:100)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
这将是一门课:

public class UrlExample {

    public void callUrl() {
        URL url = new URL("http://www.google.com/");
        HttpUrlConnection huc = url.openConnection(); 
        // ...
    }

}
和测试类:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ URL.class, URLConnection.class, HttpURLConnection.class, UrlExample.class }) // Other solutions suggested to specify all this but no success.
@PowerMockRunnerDelegate(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class UrlExampleTest {

    @Test
    public void mockUrl() {
        URL mockedUrl = PowerMockito.mock(URL.class);
        HttpURLConnection httpURLConnection = PowerMockito.mock(HttpURLConnection.class);
        PowerMockito.when(mockedUrl.openConnection()).thenReturn(httpURLConnection); // Exception thrown here
        // ...
    } 

}

我不知道还要尝试什么,我无法更改原始代码以用其他内容替换URL对象。

您没有模拟URL构造函数调用。 试试这个


您尚未模拟URL构造函数调用。 试试这个


是的,但我没有在问题中排除它,因为异常是在测试方法.PowerMockito.when(url.openConnection()).thenReturn(httpURLConnection);//中的mock本身之前在注释行中抛出的在这一行中,“url”应该是“mockedUrl”?这是导致此错误的原因吗?这应该是编译时错误,对吧?我的意思是,在我最初的测试用例中是mockedUrl,在这里写问题是个错误。很抱歉给你带来了困惑。我现在已经纠正了这个问题。没有编译时错误,但是运行时在我注释的行(
when()
)中抛出了
AbstractMethodError
)。我这样做了,但我没有在问题中排除它,因为在注释的行中,异常是在测试方法.PowerMockito.when(url.openConnection())中的mock本身之前抛出的。然后返回(httpURLConnection);//这一行中的“url”应该是“mockedUrl”?这是导致此错误的原因吗?应该是编译时错误,对吧?我的意思是,在我最初的测试用例中是mockedUrl,在这里写问题是一个错误。很抱歉造成混淆。我现在已经更正了问题。没有编译时错误,但是抛出了
AbstractMethodError
在运行时,在我注释的行中(
when()
)。
@Test
public void mockUrl() {
    URL mockedUrl = PowerMockito.mock(URL.class);
    HttpURLConnection httpURLConnection = PowerMockito.mock(HttpURLConnection.class);
    PowerMockito.when(mockedUrl.openConnection()).thenReturn(httpURLConnection); 
    PowerMockito.whenNew(URL.class).withNoArguments().thenReturn(mockedUrl);// mocking constructor call.
}