gpt4 book ai didi

java - 如何在mockito中模拟Class.forName()

转载 作者:行者123 更新时间:2023-12-01 18:42:45 30 4
gpt4 key购买 nike

我有一个在其中调用 Class.forName() 的方法。当我创建单元测试时,它会抛出 ClassNotFoundException。有没有办法模拟 Class.forName() 行为?

需要测试的方法:

public Map<String, Object> invokeOperation(String className, String methodName) {
try {
final Class<?> implClass =
Class.forName(className);
final Object obj= implClass.getDeclaredConstructor().newInstance();
final Class<?>[] parameterTypes = getParamTypes();
final Object[] args = getParamValues();
final Method method = obj.getMethod(methodName, parameterTypes);
final Map<String, Object> result = (Map<String, Object>) method.invoke(obj, args);
return result;
} catch (final ClassNotFoundException | InstantiationException e) {
e.printStackTrace();
}
}

最佳答案

我认为你不应该模拟 Class.forName 方法。

而是考虑:

  1. 为测试创建一个您想要在测试中检查的特殊类,如果您使用构建系统(如 maven),请将其放入 src/test/java 文件夹中,这样这个类就不会达到生产工件。这将覆盖一条“幸福之路”

  2. 如果您想测试异常,请考虑以下重构(我将调用包含 invokeOperation 方法 OperationInvoker 的类):

public class OperationInvoker {
private ClassByNameResolver classByNameResolver;
public OperationInvoker(ClassByNameResolver classByNameResolver) {
this.classByNameResolver = classByNameResolver;
}

public Map<String, Object> invokeOperation(String className, String methodName) {
try {
final Class<?> implClass = classByNameResolver.resolveClass(className);

final Object obj= implClass.getDeclaredConstructor().newInstance();
final Class<?>[] parameterTypes = getParamTypes();
final Object[] args = getParamValues();
final Method method = obj.getMethod(methodName, parameterTypes);
final Map<String, Object> result = (Map<String, Object>) method.invoke(obj, args);
return result;
} catch (final ClassNotFoundException | InstantiationException e) {
e.printStackTrace();
}
}
}

public class ClassByNameResolver { // or provide an interface and implementation
public Class<?> resolveClass(String name) throws ... {
return Class.forName(name);
}
}

现在,这允许使用mockito轻松模拟ClassByNameResolver来模拟抛出异常的情况。

这是一个品味问题,但在这种情况下,单元测试可以同时涵盖这两个类(单元=两个类)

关于java - 如何在mockito中模拟Class.forName(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59891111/

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