Class 必须在内部创建新对象,无法从单元测试访问
Class has to create new object internally, which can't be accessed from unit test
我们有一个class,其目的是改变接收到的对象的某些字段的值并保持其其他字段的值
public void process(SomeType someObject) {
SomeType modifiedObject = modifyObject(someObject);
nextClass.process(modifiedObject);
}
private SomeType modifyObject(SomeType someObject) {
String someValueFromServiceCall = someService.getSomeValue(...);
SomeType modifiedObject = new SomeType.Builder()
.withSomeFieldValuesFromSomeObjectItself(...)
.withSomeFieldValuesFromServiceCall(someValueFromServiceCall)
.build();
return modifiedObject;
}
SomeType
是遗留的 class,我们可以仅使用其构建器 class 创建它,它没有 setter 方法。这意味着我们不能修改接收到的 someObject
本身,但必须从 modifyObject()
构建和 return 一个新的 SomeType
对象,然后 main 方法可以将其传递给处理下一个 class
然而,这似乎会在单元测试期间引发问题。我们似乎无法从单元测试 class 访问内部 modifiedObject
并且我们似乎无法对其进行 expects/asserts
SomeType someObject = createSomeObjectForTest();
expect(someServiceMock.getSomeValue(...)).andReturn(SOME_VALUE);
expect(nextClassMock.process(someObject)).andReturn(...); //this is not someObject, but the new internal modifiedObject created within underTest
underTest.process(someObject);
assertEquals(someObject.getSomeField(), SOME_VALUE); //this is not someObject, but the new internal modifiedObject created within underTest
ArgumentCaptor
的使用方法如下:
// mock and make sure all fields required for modify are set
SomeType arg = create();
ArgumentCaptor<SomeType> captor = ArgumentCaptor. forClass(SomeType.class);
sut.process(arg) ;
verify (nextClass). process(captor.capture());
SomeType modified = captor.get();
我们有一个class,其目的是改变接收到的对象的某些字段的值并保持其其他字段的值
public void process(SomeType someObject) {
SomeType modifiedObject = modifyObject(someObject);
nextClass.process(modifiedObject);
}
private SomeType modifyObject(SomeType someObject) {
String someValueFromServiceCall = someService.getSomeValue(...);
SomeType modifiedObject = new SomeType.Builder()
.withSomeFieldValuesFromSomeObjectItself(...)
.withSomeFieldValuesFromServiceCall(someValueFromServiceCall)
.build();
return modifiedObject;
}
SomeType
是遗留的 class,我们可以仅使用其构建器 class 创建它,它没有 setter 方法。这意味着我们不能修改接收到的 someObject
本身,但必须从 modifyObject()
构建和 return 一个新的 SomeType
对象,然后 main 方法可以将其传递给处理下一个 class
然而,这似乎会在单元测试期间引发问题。我们似乎无法从单元测试 class 访问内部 modifiedObject
并且我们似乎无法对其进行 expects/asserts
SomeType someObject = createSomeObjectForTest();
expect(someServiceMock.getSomeValue(...)).andReturn(SOME_VALUE);
expect(nextClassMock.process(someObject)).andReturn(...); //this is not someObject, but the new internal modifiedObject created within underTest
underTest.process(someObject);
assertEquals(someObject.getSomeField(), SOME_VALUE); //this is not someObject, but the new internal modifiedObject created within underTest
ArgumentCaptor
的使用方法如下:
// mock and make sure all fields required for modify are set
SomeType arg = create();
ArgumentCaptor<SomeType> captor = ArgumentCaptor. forClass(SomeType.class);
sut.process(arg) ;
verify (nextClass). process(captor.capture());
SomeType modified = captor.get();