Как заставить Mockito высмеивать константу из другого файла? - PullRequest
0 голосов
/ 08 января 2019

EDIT: метод, который я тестирую, вызывает эту константу, определенную в другом классе, поэтому я хочу проверить, работает ли этот метод независимо от того, как другой класс определяет константу. Насмешка над этим была первой вещью, о которой я мог подумать, но я открыт для других идей о том, как проверить это чистым, безопасным способом

(Обобщены имена классов, методов и переменных)

Я пытаюсь понять, как написать тест. Один из моих методов получает константу из другого класса, например:

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();

Я довольно растерялся относительно того, как именно я должен насмехаться над этой константой.

1 Ответ

0 голосов
/ 08 января 2019

Как вы обнаружили, вы не можете высмеивать значение константы.

Вероятно, самым простым способом было бы преобразование вашего проекта в использование интерфейса для предоставления значения, а не непосредственного использования значения.

Что-то вроде:

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));

Ваш немодированный код может использовать лямбду для предоставления реального значения:

obj = new MyClass(() -> OtherClass.CONSTANT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...