gpt4 book ai didi

java - 使用 'any' 使用 JMockit stub 静态方法

转载 作者:行者123 更新时间:2023-12-01 07:31:35 25 4
gpt4 key购买 nike

我想测试,Collection.sort(...) 是否被 JMockit 调用。 :

final List<Employee> employees = new ArrayList<>();
new Expectations() {
{
Collections.sort((List<Employee>) any);
result = employees;
}
};

assertThat(EmployeeRepository.getAllOrderedByName()).isSameAs(employees);

这是我正在测试的示例存储库的实现:

public class EmployeeRepository {

private static List<Employee> employees = new ArrayList<>();

public static List<Employee> getAllOrderedByName() {
Collections.sort(employees);
return employees;
}
}

当我运行单元测试时,我在 Collections.sort 处收到 NullPointerException。这似乎是模拟自身的一个问题,因为调试器永远不会到达 getAllOrderedByName 方法中的断点。

如何通过 JMockit 使用 any 来 stub 静态方法?

最佳答案

在您的测试代码中,Collections类从未被指定为被模拟。因此,Collections.sort((List<Employee>) any);调用会抛出 NPE,因为 any 的值为空,实际的 sort方法被执行。

您可能认为期望 block 内的任何方法调用都会被自动模拟,但这不是 JMockit API 的工作方式。相反,您需要通过声明用 @Mocked 注释的模拟字段或模拟参数来显式指定模拟哪些类型。 , @NonStrict , @Cascading ,或@Capturing .

此外,在本例中Collections.sort是一个返回 void 的方法,所以记录它的返回值是没有意义的。

此外,无论如何我也不推荐这样编写测试。相反,它应该验证结果集合是否已排序,而无需 mock Collections类。

关于java - 使用 'any' 使用 JMockit stub 静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16966404/

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