Как настроить вызов метода mocked объекта в mockito, не вызывая сам оригинальный метод - PullRequest
8 голосов
/ 09 марта 2012

mockito-version: 1.9.0

Я хочу настроить вызов метода для объекта mockito в mockito без вызова самого исходного метода:

EDIT: этот пример действительно работаеткак и ожидалось, т.е. метод тела "test ()" не выполняется.Однако после дальнейшего изучения я заметил, что у исходного метода был модификатор видимости по умолчанию, и я подозреваю, что это вызывает проблемы, так как после изменения его на public (не должно ли это быть тем же ?!) он работает как ожидалось.* Например

public class TestClass {
  public String test() {
    System.out.println("test called!");
    return "test";
  }
}

//in test
TestClass mock = mock(TestClass.class);

when(mock.test()).thenReturn("mock!"); //<-- prints test called here? why? how can I switch it off?

1 Ответ

8 голосов
/ 09 марта 2012

Следующее, работающее под Mockito 1.9.0 и JUnit 4.8.2, не выводит что-либо на мою консоль:

import static org.mockito.Mockito.*;

import org.junit.Test;

public class TestNonCall {
  public class TestClass {
    public String test() {
      System.out.println("test called!");
      return "test";
    }
  }

  @Test
  public void doTest() {
    final TestClass mock = mock(TestClass.class);

    when(mock.test()).thenReturn("mock!");
  }
}

Далее, если я добавлю точку останова в метод test (), она никогда не будет достигнута.

Возможно, опубликуйте больше кода? Похоже, ваш пример не достаточно сложен, чтобы продемонстрировать поведение, с которым у вас проблемы.

Также: используете ли вы последнюю версию Mockito?

Редактировать: Новая мысль: вы издеваетесь над финальным методом?

Если вы добавите модификатор final к методу, над которым вы издеваетесь, вы получите поведение, о котором вы сообщили.

Это потому, что Mockito не высмеивает финальные и статические методы. Вместо этого он делегирует вызовы реальной реализации.

Может ли ваш реальный код пытаться смоделировать последний метод?

Если это так, вы можете использовать PowerMock , который является расширением Mockito, позволяющим высмеивать финальные методы.

Вам понадобится добавить следующие аннотации к вашему классу тестовых примеров:

@RunWith(PowerMockRunner.class)
@PrepareForTest(TestClass.class)
public class TestNonCall {
  // ...
}

и смоделируйте класс с помощью метода PowerMock в своем методе тестирования:

final TestClass mock = PowerMockito.mock(TestClass.class);

затем продолжайте как обычно.

...