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

У нас есть класс, целью которого является изменение значений в некоторых полях полученного объекта и сохранение значений других его полей

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 - это устаревший класс, который мы можем создать, используя только его класс построителя, и у него нет методов установки. Это означает, что мы не можем изменить полученный someObject сам, но должны построить и вернуть новый SomeType объект из modifyObject(), который затем метод main может передать для обработки следующему классу

Однако, похоже, это вызывает проблемы во время модульного тестирования. Похоже, мы не можем получить доступ к внутреннему modifiedObject из класса модульного тестирования, и, как нам кажется, мы не можем ожидать или утверждать его

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

1 Ответ

0 голосов
/ 06 ноября 2018

Вот как использовать 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();
...