Mockito - вызов реальных методов во время предложения When - ThenReturn - PullRequest
0 голосов
/ 11 февраля 2019

Рассмотрим следующий класс (с использованием CDI + сокращенный Restclient)

public class A {

 @Inject
 Restclient client;

 public Object init(String token) {
    String b = createB(token);
    return c(b);
 }

 public String createB(String token)
    return client.getB(token);
 }

 public Object c(String b) {
   return new C(b);
 }
}

Я хочу смоделировать метод createB (токен), так как я не хочу тестировать клиент Rest.Поэтому я сделал следующее:

public class TestA {

     @Mock
     A a;

     @Test
     public void testA() {
          when (a.createB("123")).thenReturn("FakeB");

          Object c = a.init("123");
         assertNotNull(c); // Fails
     }
}

По какой-то причине этот тест JUnit 4 + Mockito 2.18 не прошел, так как 'c' пуст, но мои методы работают правильно (проверили их).

Если я использую @Spy для A, я получаю NPE, потому что мой Restclient не инициализируется (даже если я добавляю клиент @Mock RestClient) и когда (...). ThenReturn (...) фактически вызывает реальный метод...

Понятия не имею, как это исправить, даже если это кажется таким простым ...

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

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

doXxx(...).when(spyObject).method();

Итак, в вашем случае это будет работать:

public void test_a() {
  ...

  doReturn("FakeB").when(restClient).getB("token"));
  assertNotNull(a.init("token"))
}
0 голосов
/ 11 февраля 2019

Используйте @Mock в сочетании с @InjectMocks.

@RunWith(MockitoJUnitRunner.class)
public class TestA {
   @Mock
   RestClient restClient;

   @InjectMocks
   A a;

   public void test_a() {
      ...

      when(restClient.getB("token")).thenReturn("FakeB")
      assertNotNull(a.init("token"))
   }
}

Однако вы должны разрешить вашему классу A вводить RestClient, например,

public class A {
   final Restclient restClient;

   @Inject
   public A(final RestClient restClient) {
      this.restClient = restClient;
   }

...

Что, честно говоря, является оптимальным способом борьбы с зависимостями (и использования CDI).

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