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

мокито-версия: 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?

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


Ответы (1)


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

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

person Tom Tresansky    schedule 09.03.2012
comment
обновил пост. после опробования примера, опубликованного выше, - действительно нужно было сделать это раньше! - У меня те же результаты, что и у вас. Я изменил модификатор метода mocked со стандартного на общедоступный (который на самом деле должен быть таким же!?), И теперь он работает. - person forste; 11.03.2012
comment
Вау, у меня была такая же проблема, и я пропустил этот маленький модификатор... Вы спасли мне жизнь! - person thSoft; 19.07.2012