Проблема при издевательстве в юнит-тесте - PullRequest
0 голосов
/ 16 апреля 2019

Я сталкиваюсь с проблемой, когда высмеиваю вещи для теста junit.

Сценарий такой:

Класс A реализует интерфейс из стороннего jar-файла и должен реализовать method1.В дополнение к method1, A также содержит method2, который вызывается из method1.Сам метод method2 вызывает какую-то внешнюю службу.

Я хочу выполнить unit1 test method1.

method1 принимает ввод, скажем, X. X имеет входную переменную, заключенную в него, скажем, var1.var1 используется логикой в ​​method1, а method1 устанавливает другую переменную, скажем, var2, в X.

Итак, я сначала смоделирую класс A, чтобы смоделировать метод2.

A a= Mockito.spy(new A());
doReturn("some dummy value").when(a).method2();

Затем я также должен смоделировать X для установки var1.

X x= mock(X.class);
when(x.getVariable("var1")).thenReturn("some dummy value for var1");

Наконец:

a.method1(x);

Внутри, метод1, который я делаю:

x.setVariable("var2","some value for var2").

Теперь в модульном тесте, когда я пытаюсь извлечь var2 из x, я получаю значение null.

x.getVariable("var2");

Я ожидаю "некоторого значения для var2", но вместо этого я получаю значение null.

1 Ответ

1 голос
/ 16 апреля 2019

Вы правильно используете частичную насмешку над классом A, но вы используете насмешку над классом X.

У вас нет ожиданий, установленных на x.getVariable("var2"), и поэтому он всегда возвращает ноль. Вызов x.setVariable("var2","some value for var2"). на макет не влияет на этот звонок

Что я предлагаю:

  1. Если возможно, просто используйте реальный X вместо макета
  2. В качестве альтернативы, вы также можете частично смоделировать X
X x = mock(X.class);
when(x.getVariable("var2")).thenCallRealMethod();
doCallRealMethod().when(x).setVariable(anyString(), anyString());
when(x.getVariable("var1")).thenReturn("some dummy value for var1");

Дополнительно, если тестируемый метод method1 не вызывает method2 в своем теле, используйте реальный экземпляр A вместо частичного макета

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...