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

Java 如何让Mockito模拟另一个文件中的常量?,java,testing,mockito,Java,Testing,Mockito,编辑:我正在测试的方法调用另一个类中定义的这个常量,所以我想测试这个方法是否独立于另一个类如何定义该常量。嘲弄它是我能想到的第一件事,但对于如何以干净、安全的方式测试它,我愿意接受其他想法 (类、方法和变量名是泛化的) 我想知道如何写一个测试。 我的一个方法从另一个类获取常量,如下所示: OtherClass.CONSTANT 这个常数定义为: public static final List<Long> CONSTANT = ImmutableList.of(1, 2);

编辑:我正在测试的方法调用另一个类中定义的这个常量,所以我想测试这个方法是否独立于另一个类如何定义该常量。嘲弄它是我能想到的第一件事,但对于如何以干净、安全的方式测试它,我愿意接受其他想法

(类、方法和变量名是泛化的)

我想知道如何写一个测试。 我的一个方法从另一个类获取常量,如下所示:

OtherClass.CONSTANT
这个常数定义为:

public static final List<Long> CONSTANT =
  ImmutableList.of(1, 2);
但这给了我一个错误:

RegularImmutableList cannot be returned by otherFunction()
otherFunction() should return String
Argument passed to when() is not a mock!
Example of correct stubbing:
doThrow(new RuntimeException()).when(mock).someMethod();
otherFunction()是代码库中的其他函数,它似乎与我所研究的任何东西都不相关

我也试过了

doReturn(ImmutableList.of(1, 2)).when(OtherClass.CONSTANT);
但是,正如你可能猜到的,它给了我一个错误:

RegularImmutableList cannot be returned by otherFunction()
otherFunction() should return String
Argument passed to when() is not a mock!
Example of correct stubbing:
doThrow(new RuntimeException()).when(mock).someMethod();

我完全不知道该如何模拟这个常数。

正如你所发现的,你不能模拟常数的值

最简单的方法可能是将设计转换为使用接口提供值,而不是直接使用值

比如:

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

public MyClass(ConstantSupplier supplier) {
    this.supplier = supplier;
}
非模拟代码可以使用lambda提供实际值:

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

什么类型的OtherClass.CONSTANT?如何声明OtherClass.CONSTANT?私有的最终的静态?为什么要模拟常量?你不能用mockito(仅)模拟静态事物,你需要PowerMock(ito)…常量就是常量。您不需要做任何事情来模拟它:它已经定义好了。mock只适用于那个些你们确实需要在测试中很难构建的东西。明白了,这是有道理的。谢谢你的回答!