如何测试在其中创建新对象的演示者方法?

How to test presenter method that create a new object inside it?

我有这个方法来验证单位。我发送字段值并在其中方法创建一个新模型,然后 return 通过接口创建该模型。

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)

显然有问题,因为我在这里创建了一个新的 Unit 实例:

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

validate() 方法中,我创建了另一个 Unit 实例。

我该如何解决这个问题?

将相同的参数传递给您的验证方法,例如

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

您可能必须重写您的 Unitequals/hashcode 方法,以便它们比较它们的内容而不是实例本身。

如果您想在 Kotlin 中执行此操作,可以使用 Mockito check 函数对作为 displayUnitValid() 的参数传递的 Unit 实例进行断言。像这样:

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

有关 check 的更多信息 here

以下是可能对其他人有用的工作解决方案:

 @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);
  }