Mockito @Mock неправильно внедряет именованные макеты, используя конструктор - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь использовать @Mock для ввода двух разных объектов в тестируемый класс.Мне нужно, чтобы они были двумя разными объектами, чтобы я мог использовать when на каждом для получения разных результатов.Все, что я искал на SO, указывает на эту работу, но при запуске теста ниже - оба объекта одинаковы.

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

import com.ihm.pp.test.UnitTest;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

/**
 * @author Josh Johnston
 */
@Category(UnitTest.class)
@RunWith(MockitoJUnitRunner.class)
public class ConstructorInjectionBug {

  @Mock
  private IBroken aBroken;

  @Mock
  private IBroken bBroken;

  @InjectMocks
  private UsesBroken usesBroken;

  @Test
  public void testBrokenConstructorInjection() {

    when(bBroken.getNumber()).thenReturn(2);
    assertEquals(2, usesBroken.getbBroken().getNumber());

    when(aBroken.getNumber()).thenReturn(1);
    assertEquals(1, usesBroken.getaBroken().getNumber());
  }
}

interface IBroken {
  int getNumber();
}

class UsesBroken {

  private IBroken aBroken;
  private IBroken bBroken;

  public UsesBroken(IBroken aBroken, IBroken bBroken) {
    this.aBroken = aBroken;
    this.bBroken = bBroken;
  }

  public IBroken getaBroken() {
    return aBroken;
  }

  public IBroken getbBroken() {
    return bBroken;
  }
}

Результат:

java.lang.AssertionError:
    Expected :1
    Actual   :2

at org.junit.Assert.failNotEquals(Assert.java:834)
    at org.junit.Assert.assertEquals(Assert.java:645)
    at org.junit.Assert.assertEquals(Assert.java:631)
    at ConstructorInjectionBug.testBrokenConstructorInjection(ConstructorInjectionBug.java:37)

1 Ответ

0 голосов
/ 20 декабря 2018

@InjectMocks не будет знать, какой IBroken ввести.Таким образом, дело не в том, что он сломан, а в том, что дизайн имеет недостатки.

Чтобы получить желаемое поведение, вам нужно явно ввести макеты в тестируемый объект.

@Category(UnitTest.class)
@RunWith(MockitoJUnitRunner.class)
public class ConstructorInjectionBug {

  @Mock
  private IBroken aBroken;

  @Mock
  private IBroken bBroken;

  private UsesBroken usesBroken;

  @Test
  public void testBrokenConstructorInjection() {
    //Arrange
    usesBroken = new UsesBroken(aBroken, bBroken);
    when(bBroken.getNumber()).thenReturn(2);
    when(aBroken.getNumber()).thenReturn(1);

    //Act & Assert
    assertEquals(2, usesBroken.getbBroken().getNumber());    
    assertEquals(1, usesBroken.getaBroken().getNumber());
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...