【问题标题】:Cannot test URL with PowerMockito无法使用 PowerMockito 测试 URL
【发布时间】:2020-04-20 17:33:37
【问题描述】:

我在这里阅读了一些问题,但很遗憾,这些问题对我不起作用。

我正在测试一个 Spring Boot 应用程序,我正在尝试使用 PowerMockito 在测试用例中模拟一个 URL 对象,但它对我不起作用,当我想模拟 openConnection() 方法时,它会给我一个 @ 987654322@.

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 对象。

【问题讨论】:

    标签: java spring-boot junit mockito powermock


    【解决方案1】:

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

    @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.
    } 
    

    【讨论】:

    • 我做了,但我没有将它包含在问题中,因为之前在注释行中抛出了异常,而模拟本身在测试方法中。
    • PowerMockito.when(url.openConnection()).thenReturn(httpURLConnection); // 在这一行中 'url' 应该是 'mockedUrl' ?
    • 这是导致这个错误的原因吗?应该是编译时错误吧?
    • 我的意思是,在我原来的测试用例中它是 mockedUrl,在这里写问题是错误的。对困惑感到抱歉。我现在已经更正了这个问题。没有编译时错误,但AbstractMethodError 在我评论的行中运行时抛出(when())。
    猜你喜欢
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多