Фактическая проблема описана в сообщении об ошибке: Only void methods can doNothing()
Метод create()
не является недействительным, поэтому вы не можете смоделировать его с помощью doNoting()
, поэтому вы должны использовать doReturn
.В вашем случае вы можете вернуть макет Blob
:
Blob mockBlob = mock(Blob.class);
when(mockBlob.exists()).thenReturn(true);
doReturn(mockBlob).when(mockStorage).create(blobInfo, Files.readAllBytes(Paths.get(tempFile.getAbsolutePath())));
Это первая ошибка.И, во-вторых, похоже, что вы не внедряете шпионский объект в тестируемый объект.Ваш метод getStorageConnection()
создаст новый экземпляр Storage
при его вызове и не учитывает шпионский объект.Итак, вы издеваетесь над StorageOptions.class
, но метод StorageOptions.getDefaultInstance()
ничего не знает об этом смоделированном объекте.
Итак, здесь я вижу два пути решения вашей проблемы.Первый, и он более предпочтителен, как для меня, заключается в том, чтобы ввести зависимость либо в метод, либо в ваш класс.Внедрение зависимости в метод:
@Override
public boolean upload(Storage storage, File file) throws MetaFeedException {
Но это может быть не так, если ваш метод переопределяет некоторый интерфейс, как я полагаю.Таким образом, вы можете переместить ваш метод getStorageConnection
в отдельный класс StorageProvider
и внедрить его экземпляр в свой класс, а затем в тесте вы можете смоделировать StorageProvider
, чтобы вернуть spy
из Storage
.В методе загрузки вы будете вызывать:
Optional<Storage> storage = storageProvider.getStorageConnection(storageConfiguration.getJsonCredentialFilePath());
Второй путь, который является довольно обходным, состоит в том, чтобы сделать метод getStorageConnection
защищенным и переопределить его в вашем тесте, чтобы вернуть подсмотренный объект.В вашем тесте:
gcpStorageManager = new GcpStorageManager() {
@Override
protected Storage getStorageConnection(...) {
return mockedStorage;
}
}