Java mock private void方法给出了AssertionError
我正在使用Powermock为Jersey web服务构建测试用例,并尝试模拟数据库函数调用,特别是针对PUT和POST调用。然而,我在如何让它发挥作用方面遇到了一些问题 以下是其中一个web服务调用的外观:Java mock private void方法给出了AssertionError,java,unit-testing,powermock,Java,Unit Testing,Powermock,我正在使用Powermock为Jersey web服务构建测试用例,并尝试模拟数据库函数调用,特别是针对PUT和POST调用。然而,我在如何让它发挥作用方面遇到了一些问题 以下是其中一个web服务调用的外观: @Path("/v1.0.0") public class WebService { @POST @Path("application") @Consumes(MediaType.APPLICATION_JSON) public Response crea
@Path("/v1.0.0")
public class WebService {
@POST
@Path("application")
@Consumes(MediaType.APPLICATION_JSON)
public Response createApplication(@QueryParam("callback") String callbackFunction, String body)
throws NamingException, SQLException, IllegalStateException, CacheException, UnknownHostException,
IOException {
String query = "exec spInsertApplication ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?";
String[] params = new String[16];
JSONObject json = (JSONObject) JSONValue.parse(body);
params[0] = json.get("name").toString();
params[4] = json.get("software").toString();
params[14] = json.get("customerid").toString();
//Null checks for other params
runUpdateQuery(query, params);
return generateResponse(callbackFunction, null);
}
private void runUpdateQuery(String query, String[] queryParameters) {
//Handles running DB query
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(WebService.class)
@PowerMockIgnore( {"javax.management.*"})
public class TestRestWebService {
@Test
public void test_createApplication_returns_http_success() throws Exception {
String query = "exec spInsertApplication ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?";
String[] params = new String[16];
params[0] = "test_app_name";
params[4] = "test_software";
params[14] = "23";
WebService tested = createPartialMockAndInvokeDefaultConstructor(WebService.class, "runUpdateQuery");
expectPrivate(tested, "runUpdateQuery", query, params).andAnswer(
new IAnswer<Void>() {
@Override
public Void answer() throws Throwable {
return null;
}
});
replay(tested);
String JSONString = "{\"name\":\"test_service_name\",\"software\":\"test_software\",\"customerid\":\"23\"}";
Response output = tested.createApplication("CALLBACK", JSONString);
verify(tested);
assertTrue(output.getStatus() == 200);
}
}
以及我的测试用例当前的样子:
@Path("/v1.0.0")
public class WebService {
@POST
@Path("application")
@Consumes(MediaType.APPLICATION_JSON)
public Response createApplication(@QueryParam("callback") String callbackFunction, String body)
throws NamingException, SQLException, IllegalStateException, CacheException, UnknownHostException,
IOException {
String query = "exec spInsertApplication ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?";
String[] params = new String[16];
JSONObject json = (JSONObject) JSONValue.parse(body);
params[0] = json.get("name").toString();
params[4] = json.get("software").toString();
params[14] = json.get("customerid").toString();
//Null checks for other params
runUpdateQuery(query, params);
return generateResponse(callbackFunction, null);
}
private void runUpdateQuery(String query, String[] queryParameters) {
//Handles running DB query
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(WebService.class)
@PowerMockIgnore( {"javax.management.*"})
public class TestRestWebService {
@Test
public void test_createApplication_returns_http_success() throws Exception {
String query = "exec spInsertApplication ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?";
String[] params = new String[16];
params[0] = "test_app_name";
params[4] = "test_software";
params[14] = "23";
WebService tested = createPartialMockAndInvokeDefaultConstructor(WebService.class, "runUpdateQuery");
expectPrivate(tested, "runUpdateQuery", query, params).andAnswer(
new IAnswer<Void>() {
@Override
public Void answer() throws Throwable {
return null;
}
});
replay(tested);
String JSONString = "{\"name\":\"test_service_name\",\"software\":\"test_software\",\"customerid\":\"23\"}";
Response output = tested.createApplication("CALLBACK", JSONString);
verify(tested);
assertTrue(output.getStatus() == 200);
}
}
如何正确地模拟这个私有void方法,以避免在测试期间调用数据库?在对这个测试和文档进行了几次挖掘之后,我发现
expectPrivate
调用没有找到我的方法。下面是我发现我可以指定函数的方法:
expectPrivate(tested, WebService.class.getDeclaredMethod("runUpdateQuery", String.class, String[].class),
EasyMock.anyString(), EasyMock.aryEq(params)).andAnswer(new IAnswer<Void>() {
@Override
public Void answer() throws Throwable {
return null;
}
});
expectPrivate(已测试,WebService.class.getDeclaredMethod(“runUpdateQuery”、String.class、String[].class”),
EasyMock.anyString(),EasyMock.aryEq(params)).andAnswer(new IAnswer()){
@凌驾
公共无效答案()可丢弃{
返回null;
}
});
这还允许我在使用泛型类型定义函数时,与函数最初希望调用的数组进行比较