Мой смоделированный метод возвращает один и тот же экземпляр при каждом вызове. Как мне получить его, чтобы он возвращал новый экземпляр? - PullRequest
0 голосов
/ 21 сентября 2018
private mockedObject cpMock;

@Test
public void test() {

    Manager managerTest = new Manager(cpMock, size);

    Instance instance = new Instance(size);
    when(cpMock.requestInstance()).thenReturn(instance);

}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

thenReturn хорошо, когда все, что вы делаете, возвращает предварительно вычисленное значение.Если вы хотите смоделировать экземпляр, чтобы что-то делал каждый раз, когда вызывается ваш метод, тогда правильным решением будет Ответ (переданный с thenAnswer или doAnswer)Это интерфейс с одним методом, который хорошо работает с Java 8. Вы можете получить подробную информацию о вызове (включая его аргументы) с его параметром InvocationOnMock , а возвращаемое значение Answer.answer будет действовать каквозвращаемое значение метода.

Это также хорошее решение, когда вам нужно, чтобы у вашего вызова были побочные эффекты, такие как изменение его аргумента или вызов функции обратного вызова.

when(cpMock.requestInstance()).thenAnswer(invocation => new Instance(size));

Без лямбда-выражений,вызов немного более многословен, но не так уж и плох:

when(cpMock.requestInstance()).thenAnswer(new Answer<Instance>() {
  @Override public Instance answer(InvocationOnMock invocation) {
    return new Instance(size));
  }
}
0 голосов
/ 21 сентября 2018

Существует перегрузка для thenReturn, который имеет параметр var-arg:

when(cpMock.requestInstance())
   .thenReturn(instance, instance1, instance2, instance3);

В соответствии с его javadocs, он вернет эти объекты в указанном порядке.После четвертого вызова будет возвращено instance3 (последнее значение):

Устанавливает последовательные возвращаемые значения, которые будут возвращены при вызове метода.Например: when(mock.someMethod()).thenReturn(1, 2, 3);Последнее возвращаемое значение в последовательности (в примере: 3) определяет поведение последующих последовательных вызовов.

...