如何测试在其中创建新对象的演示者方法?
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);
您可能必须重写您的 Unit
类 equals/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);
}
我有这个方法来验证单位。我发送字段值并在其中方法创建一个新模型,然后 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);
您可能必须重写您的 Unit
类 equals/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);
}