У меня есть сомнения по поводу того, стоит ли мне создавать тесты, которые содержат много фиктивных объектов или нет.
Я недавно прочитал Когда мне издеваться? , и я чувствую растерянность.
Давайте посмотрим на метод, который у меня есть (этопросто для иллюстрации проблемы)
@Override
protected void validate() throws WTException {
Either<ImportError, RootFinderResult> rootPart = getDataValidator().getRootPart();
if (rootPart.isLeft()) {
addValidationMessage(ROOT_PART_NOT_FOUND);
} else if (rootPart.isRight()) {
getObjectsToValidate().forEach(Lambda.uncheckedBiConsumer((part, epmDocuments) -> {
LocalizableMessage rootRevision = getRevision(part);
Optional<EPMDocument> wrongRevisionEPM = epmDocuments.stream()
.filter(epmDocument -> !isSameRevision(rootRevision, epmDocument))
.findAny();
wrongRevisionEPM.ifPresent(epmDocument -> addValidationMessage("blabla"));
}));
}
}
Для работы всех следующих методов необходимо подключение к серверу, в противном случае они будут выдавать ошибки
getDataValidator().getRootPart();
getRevision(part)
!isSameRevision(rootRevision, epmDocument))
Кроме того, я не могу создавать «реальные» объекты документов части или epm.Это также требует наличия подключения к серверу.
Итак, на данный момент, что я действительно хочу проверить, так это логика этой части кода
* 1023.*
Но чтобы проверить это, мне нужно смоделировать действительно много объектов
@Spy
@InjectMocks
private SameRevision sameRevision;
@Mock
private WTPartRelatedObjectDataValidator wTPartRelatedObjectDataValidator;
@Mock
private ValidationEntry validationEntry;
@Mock
private WTPart rootPart1, rootPart2;
@Mock
private EPMDocument epmDocument1, epmDocument2, epmDocument3;
@Mock
private Either<ImportError, RootFinderResult> rootPart;
@Mock
private LocalizableMessage rootPartRevisionOne, rootPartRevisionTwo;
, чтобы наконец я смог проверить логику:
@Test
@DisplayName("Should contain error message when part -> epms revisions are not the same")
void shoulHaveErrorMessagesWhenDifferentRevisions() throws Exception {
doReturn(getMockObjectsToValidate()).when(sameRevision).getObjectsToValidate();
doReturn(rootPart).when(liebherrWTPartRelatedObjectDataValidator).getRootPart();
doReturn(false).when(rootPart).isLeft();
doReturn(true).when(rootPart).isRight();
doReturn(rootPartRevisionOne).when(sameRevision).getRevision(rootPart1);
doReturn(rootPartRevisionTwo).when(sameRevision).getRevision(rootPart2);
doReturn(true).when(sameRevision).isSameRevision(rootPartRevisionOne, epmDocument1);
doReturn(false).when(sameRevision).isSameRevision(rootPartRevisionOne, epmDocument2);
doReturn(true).when(sameRevision).isSameRevision(rootPartRevisionTwo, epmDocument3);
validationEntry = sameRevision.call();
assertEquals(1, validationEntry.getValidationMessageSet().size());
}
где
doReturn(rootPart).when(liebherrWTPartRelatedObjectDataValidator).getRootPart();
doReturn(false).when(rootPart).isLeft();
doReturn(true).when(rootPart).isRight();
doReturn(rootPartRevisionOne).when(sameRevision).getRevision(rootPart1);
doReturn(rootPartRevisionTwo).when(sameRevision).getRevision(rootPart2);
можно переместить в @ BeforeEach.
Наконец-то у меня есть тест, и он работает.Это подтверждает то, что я хотел проверить, но для достижения этой цели мне пришлось приложить немало усилий, чтобы пройти через весь API, который нуждается во взаимодействии с сервером.
Как вы думаете, ребята, стоит ли создавать подобные тесты?Я предполагаю, что это широко открытая тема, потому что у многих новичков, которые пытаются войти в «тестовый мир», будет похожая проблема, поэтому, пожалуйста, не закрывайте тему из-за суждения, основанного на мнении, и оставьте свой отзыв по этой теме.