gpt4 book ai didi

java - 无法使用 Mockito 或 PowerMockito 的反射对 Java 代码进行单元测试

转载 作者:行者123 更新时间:2023-11-30 01:41:37 25 4
gpt4 key购买 nike

我正在尝试编写一个单元测试来测试这段代码,但我陷入了 native 类 java.lang.Class 的 Mockito/Powermockito 限制,如 here 所解释的那样。

我如何测试这个:

Method[] serverStatusMethods = serverStatus.getClass().getMethods();
for (Method serverStatusMethod : serverStatusMethods) {
if (serverStatusMethod.getName().equalsIgnoreCase("get" + field)) {
serverStatusMethod.setAccessible(true);
try {
Number value = (Number) serverStatusMethod.invoke(serverStatus);
response = new DataResponse(field + " value", value);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
Logger.getLogger(StatusServlet.class.getName()).log(Level.SEVERE, null, ex);
response = new ErrorResponse(HttpStatus.Code.INTERNAL_SERVER_ERROR, ex);
}
break;
}
}

在测试用例中故意抛出此异常:

catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
Logger.getLogger(StatusServlet.class.getName()).log(Level.SEVERE, null, ex);
response = new ErrorResponse(HttpStatus.Code.INTERNAL_SERVER_ERROR, ex);
}

最佳答案

当模拟类太困难时,请执行您所做的操作:添加另一层抽象。例如。将反射操作提取到一个单独的方法中:

public Number resolveServerStatus(Object serverStatus)
throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException {

Method[] serverStatusMethods = serverStatus.getClass().getMethods();
for (Method serverStatusMethod : serverStatusMethods) {
if (serverStatusMethod.getName().equalsIgnoreCase("get" + field)) {
serverStatusMethod.setAccessible(true);
return (Number) serverStatusMethod.invoke(serverStatus);
}
}
}

现在模拟 resolveServerStatus 方法。

如果您遵循single responsibility principle,那么这就是您首先应该做的事情。您的方法有两个职责:解析状态号并将其转换为 DataResponse 对象。多重职责使得测试该方法变得困难。

关于java - 无法使用 Mockito 或 PowerMockito 的反射对 Java 代码进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59750347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com