【发布时间】:2020-04-15 21:57:24
【问题描述】:
此单元测试失败。
package com.abc;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.net.URI;
import java.net.URL;
import static org.junit.Assert.assertEquals;
@RunWith(PowerMockRunner.class)
@PowerMockIgnore("javax.management.*")
@PrepareForTest({URI.class})
public class ITest2 {
@Test
public void test5() throws Exception {
URI uri = new URI("http://www.google.com");
final URL resourceUrl = ClassLoader.getSystemClassLoader().getResource("static/abc.png"); //EXISTS
PowerMockito.whenNew(URL.class).withArguments(
"http://www.google.com")
.thenReturn(resourceUrl);
URL url = uri.toURL(); // <--- At this point, url should be == resourceUrl
assertEquals(resourceUrl, url); // <--- url is http://www.google.com and not ".../static/abc.png"
}
}
此单元测试失败。
java.lang.AssertionError:
Expected :file:/Users/hidden/target/classes/static/abc.png
Actual :http://www.google.com
<Click to see difference>
你知道为什么 url != resourceUrl 吗?我错过了什么?
URI.toURL() 的代码如下:
public URL toURL()
throws MalformedURLException {
if (!isAbsolute())
throw new IllegalArgumentException("URI is not absolute");
return new URL(toString());
}
使用 Mockito 2.15 和 Powermock 2.0.7。
谢谢。
更新:
添加这些也无济于事。只是偷偷摸摸。
PowerMockito.whenNew(URL.class).withArguments(
eq("http://www.google.com"))
.thenReturn(resourceUrl);
PowerMockito.whenNew(URL.class).withArguments(Mockito.anyString()).thenReturn(resourceUrl);
PowerMockito.whenNew(URL.class).withArguments(any()).thenReturn(resourceUrl);
PowerMockito.whenNew("java.net.URL").withArguments(any()).thenReturn(resourceUrl);
PowerMockito.whenNew(URL.class).withParameterTypes(String.class)
.withArguments("http://www.google.com")
.thenReturn(resourceUrl);
PowerMockito.whenNew(URL.class).withAnyArguments().thenReturn(resourceUrl);
PowerMockito.whenNew(URL.class).withNoArguments().thenReturn(resourceUrl);
【问题讨论】:
-
@kasptom,不,它没有回答我的问题。你知道我做错了什么吗?谢谢。
-
PowerMockito 在模拟系统类方面有一定的限制,请查看here。但是,这种方法对您来说是不可能的,因为
java.net.URL是另一个系统类。 -
您可以添加一个测试,以显示您真正尝试做的更多上下文。 Mabye 嘲笑
java.net.URI可以解决您的问题。只要可以修改创建类的字节码,这至少应该是可能的。 -
@second,我在上面的代码示例中有一个名为 test5() 的简单测试。
标签: java junit mockito powermock powermockito