Проблема здесь с этим ожиданием:
Mockito.when(mockCollection.deleteOne(Filters.and(Filters.eq("aid", "TS123"),
Filters.eq("year", "2018"),
Filters.eq("position", "testCases"))))
.thenReturn(mockDeleteResult);
Bson
не реализует equals
, поэтому, когда Mockito пытается определить, должен ли он возвращать что-то из вызова collectionsDocs.deleteOne
в вашем deleteDocument
он не может соответствовать аргументу фильтра, поэтому он определяет, что collectionsDocs.deleteOne
ничего не возвращает.Чтобы убедиться в этом, просто запустите следующий код:
Bson one = Filters.and(Filters.eq("aid", "TS123"),
Filters.eq("year", "2018"),
Filters.eq("position", "testCases"));
Bson two = Filters.and(Filters.eq("aid", "TS123"),
Filters.eq("year", "2018"),
Filters.eq("position", "testCases"));
// one and two are not equal because Bson does not implement equals so
// we'll just fall back to the standard instance check in Object
assertNotEquals(one, two);
Ваш тест будет пройден - хотя и с меньшей специфичностью в отношении фильтров - если вы выразите ожидание deleteOne
следующим образом:
Mockito.when(mockCollection.deleteOne(any(Bson.class))).thenReturn(mockDeleteResult);
В качестве альтернативы вы можете использовать пользовательское сопоставление, чтобы применить свою собственную проверку на равенство для Bson.Например, вы должны изменить ожидание mockCollection.deleteOne
на следующее:
Mockito.when(mockCollection.deleteOne(argThat(new BsonMatcher(Filters.and(Filters.eq("aid", "TS123"),
Filters.eq("year", "2018"),
Filters.eq("position", "testCases"))))))
.thenReturn(mockDeleteResult);
и объявить BsonMatcher
следующим образом:
public class BsonMatcher implements ArgumentMatcher<Bson> {
private BsonDocument left;
public BsonMatcher(Bson left) {
this.left = left.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry());
}
@Override
public boolean matches(Bson right) {
// compare as BsonDocument, since this does provide an equals()
return left.equals(right.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry()));
}
}
Примечание. Вам также необходимо изменитьваши assertEquals("Delete Successful", msg);
до assertEquals("Successful Delete", msg);
, потому что deleteDocument
возвращает "Successful Delete"
:)