gpt4 book ai didi

java - 如何让 Mockito 模拟另一个文件中的常量?

转载 作者:行者123 更新时间:2023-11-28 21:19:17 42 4
gpt4 key购买 nike

编辑:我正在测试的方法调用了另一个类中定义的常量,因此我想测试该方法是否独立于其他类定义常量的方式工作。模拟它是我想到的第一件事,但我对如何以干净、安全的方式测试它的其他想法持开放态度

(类、方法和变量名是通用的)

我正在尝试弄清楚如何编写测试。我的一个方法从另一个类获取常量,如下所示:

OtherClass.CONSTANT

这个常量定义为:

public static final List<Long> CONSTANT =
ImmutableList.of(1, 2);

在这个方法的测试中,我想模拟这个调用。我试过了

when(OtherClass.CONSTANT).thenReturn(ImmutableList.of(1, 2));

但这给了我这个错误:

RegularImmutableList cannot be returned by otherFunction()
otherFunction() should return String

otherFunction() 是代码库中的一些其他函数,似乎与我一直在做的任何事情都不相关。

我也试过

doReturn(ImmutableList.of(1, 2)).when(OtherClass.CONSTANT);

但是,正如您可能猜到的那样,它给了我这个错误:

Argument passed to when() is not a mock!
Example of correct stubbing:
doThrow(new RuntimeException()).when(mock).someMethod();

我不知道应该如何精确地模拟这个常量。

最佳答案

正如您所发现的,您无法模拟常量的值。

可能最简单的方法是将您的设计转换为使用接口(interface)来提供值,而不是直接使用该值。

类似于:

interface ConstantSupplier {
List<Long> get();
}

public MyClass(ConstantSupplier supplier) {
this.supplier = supplier;
}

然后您会将对常量的引用替换为 supplier.get()

现在很容易模拟:

ConstantSupplier supplier = mock(ConstantSupplier.class);
when(supplier.get()).thenReturn(List.of(4L, 9L));

您的非模拟代码可以使用 lambda 来提供实际值:

obj = new MyClass(() -> OtherClass.CONSTANT);

关于java - 如何让 Mockito 模拟另一个文件中的常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54098044/

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