Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как настроить вызов метода издевательского объекта в mockito без вызова самого исходного метода

Автор вопроса: forsteОтветов: 1

мокито-версия: 1.9.0

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

РЕДАКТИРОВАТЬ: этот пример на самом деле работает так, как ожидалось, то есть метод тела "test()" не выполняется. Однако после дальнейшего изучения я заметил, что исходный метод имел модификатор видимости по умолчанию, и я подозреваю, что это вызывает проблемы, поскольку после изменения его на общедоступный (разве это не должно быть таким же?!) он работает, как и ожидалось.

e.g.

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?
  • when(mock.test) не компилируется, что заставляет меня подозревать остальных. Пожалуйста, проверьте еще раз, что это действительно то, о чем говорит ваш код. skaffman 09.03.2012
  • Также Mockito не имитирует окончательные классы или методы, так как это обеспечивается самой JVM. Brice 09.03.2012
  • Это должно было быть примером здесь, реальный код сделал бы вещи излишне сложными. forste 09.03.2012
  • какую версию mockito вы используете? Я знаком с проблемой, которую вы описываете, и я понимаю, что когда-то это было поведение по умолчанию. Возможно, в последних релизах он изменился. Kevin Welker 09.03.2012
  • Я использую версию 1.9.0 forste 10.03.2012

javamockingmockito

Ответы

Ответ 1 · рейтинг 8 · Tom Tresansky

Следующее, работающее под 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);

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы