我正在尝试使用 PowerMockito 来模拟我正在测试的代码中 java.net.URL 类的创建。基本上,我想防止发生真正的 HTTP 请求,而是 1)在发出请求时检查数据,2)在模拟响应上提供我自己的测试数据。这就是我正在尝试的:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ URL.class, MockedHttpConnection.class })
public class Test {
URL mockedURL = PowerMockito.mock(URL.class);
MockedHttpConnection mockedConnection = PowerMockito.mock(MockedHttpConnection.class);
...
PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments("MyURLString").thenReturn(mockedURL);
PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);
...
}
我想要测试的代码如下所示:
URL wlInvokeUrl = new URL(wlInvokeUrlString);
connection = (HttpURLConnection) wlInvokeUrl.openConnection();
早些时候,在我的测试场景中,我模拟了 wlInvokeUrlString 以匹配“MyURLString”。我还尝试使用whenNew行的各种其他形式,尝试注入模拟。无论我尝试什么,它都不会拦截构造函数。我想要做的就是“捕获”对 openConnection() 的调用,并让它返回我的模拟 HTTP 连接而不是真实的连接。
我已经在同一脚本中模拟了在此之前的其他类,并且这些类按预期工作。要么我需要第二双眼睛(可能是真的),要么 URL 类有一些独特的东西。我确实注意到,如果我使用“whenNew(URL.class).withAnyArguments()”并将“thenReturn”更改为“thenAnswer”,我可以让它触发。唯一的问题是我从来没有得到我的代码的 URL 调用。我看到的是对 URL.class 的 3 参数构造函数的调用,参数全部为空。这个类是否来自 Java 运行时并由测试运行器引导?任何帮助深表感谢。
这是使用时常犯的错误PowerMockito.whenNew
.
请注意,您必须准备创建 MyClass 新实例以进行测试的类,而不是 MyClass 本身。例如。如果执行 new MyClass() 的类被称为 X 那么你必须执行 @PrepareForTest(X.class) 才能让 whenNew 工作
From Powermock 维基 https://github.com/jayway/powermock/wiki/MockitoUsage#how-to-mock-construction-of-new-objects
所以,你需要稍微改变一下你的测试并添加到@PrepareForTest
一个创建新实例的类URL
like:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ URL.class, MockedHttpConnection.class , ConnectionUser.class})
public class URLTest {
public class URLTest {
private ConnectionUser connectionUser;
@Before
public void setUp() throws Exception {
connectionUser = new ConnectionUser();
}
@Test
public void testName() throws Exception {
URL mockedURL = PowerMockito.mock(URL.class);
MockedHttpConnection mockedConnection = PowerMockito.mock(MockedHttpConnection.class);
PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments("MyURLString").thenReturn(mockedURL);
PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);
connectionUser.open();
assertEquals(mockedConnection, connectionUser.getConnection());
}
}
where:
public class ConnectionUser {
private String wlInvokeUrlString = "MyURLString";
private HttpURLConnection connection;
public void open() throws IOException {
URL wlInvokeUrl = new URL(wlInvokeUrlString);
connection = (HttpURLConnection) wlInvokeUrl.openConnection();
}
public HttpURLConnection getConnection() {
return connection;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)