Как проверить метод презентатора, который создает новый объект внутри него? - PullRequest
0 голосов
/ 29 октября 2019

У меня есть этот метод для проверки юнитов. Я отправляю значения полей и внутри него создаю новую модель, а затем возвращаю эту модель через интерфейс.

public void validate(String unitNumber, Integer unitTypeId, String notes) {
if(!TextUtils.isEmpty(unitNumber)) {
      Unit unit = new Unit();
      unit.setUnitNumber(unitNumber);
      unit.setFlatTypeId(unitTypeId);
      unit.setNotes(notes);
      view.displayUnitValid(unit);
    } else {
      view.displayUnitNotValid();
    }
  }

Теперь я хочу провести модульное тестирование этого метода со следующим кодом.

@Test public void shouldValidateSinceUnitNumberIsValid() {
    // Given
    String unitNumber = "1";

    // When
    presenter.validate(unitNumber, null, null);

    // Then
    Mockito.verify(view).displayUnitValid(new Unit());
 }

Я получаю следующее сообщение об ошибке:

Argument(s) are different! Wanted:
view.displayUnitValid(
    com.rwar.domain.customers.Unit@57cf54e1
);
-> at com.rwar.presentation.work_orders.AddUnitPresenterTest.shouldValidateSinceUnitNumberIsValid(AddUnitPresenterTest.java:73)

Очевидно, что существует проблема, поскольку я создаю новый экземпляр модуля здесь:

Mockito.verify(view).displayUnitValid(new Unit());

И внутри validate () метод Я создаю еще один экземпляр Unit.

Как я могу это исправить?

Ответы [ 3 ]

2 голосов
/ 29 октября 2019

Передайте те же аргументы вашему методу проверки, например,

Unit expected = new Unit()
unit.setUnitNumber(unitNumber);
unit.setFlatTypeId(unitTypeId);
unit.setNotes(notes);
Mockito.verify(view).displayUnitValid(expected);

Вам, вероятно, придется переопределить ваш метод Unit classes equals / hashcode , чтобы они сравнивали свое содержимоеа не сам экземпляр.

1 голос
/ 29 октября 2019

Вот рабочее решение, которое может быть полезно кому-то еще:

 @Test public void shouldValidateSinceUnitNumberIsValid() {
    // Given
    String unitNumber = "1";

    // When
    presenter.validate(unitNumber, null, null);

    // Then use ArgumentCaptor to get unit value from newly created object inside validate() method
    ArgumentCaptor<Unit> argument = ArgumentCaptor.forClass(Unit.class);
    Mockito.verify(view).displayUnitValid(argument.capture());
    // Compare captured argument of Unit number with local unitNumber
    assertEquals(argument.getValue().getUnitNumber(), unitNumber);
  }
1 голос
/ 29 октября 2019

Если вы хотите сделать это в Kotlin, вы можете использовать функцию Mockito check для создания утверждений над экземпляром Unit, который передается в качестве аргумента displayUnitValid(). Примерно так:

Mockito.verify(view).displayUnitValid(Mockito.check { unit ->
    assertEquals(unitNumber, unit.getUnitNumber)
});

Подробнее о check здесь

...