Я пытаюсь написать модульный тест для класса, который использует Google API видения с AnnotatorImageClient
из google-cloud-vision
lib.Проблема в том, что мой смоделированный AnnotatorImageClient
по какой-то причине все еще вызывает реальный метод batchAnnotateImages
, а затем выбрасывает NPE, что нарушает мой тест.Я никогда не видел такого поведения на макете, и мне интересно, что я делаю что-то не так, есть ли ошибка в spock / groovy или это как-то связано с этой библиотекой Google?
Я уже проверил, действительно ли объект, используемый в моем классе, является имитацией, и это действительно так.Я пробовал со Споком версии 1.2-groovy-2.5 и 1.3-groovy.2.5
Класс, который тестируется:
public class VisionClient {
private final ImageAnnotatorClient client;
@Autowired
public VisionClient(final ImageAnnotatorClient client) {
this.client = client;
}
public Optional<BatchAnnotateImagesResponse> getLabelsForImage(final Image image) {
var feature = Feature.newBuilder().setType(LABEL_DETECTION).build();
var request = AnnotateImageRequest.newBuilder()
.addFeatures(feature)
.setImage(image)
.build();
return Optional.ofNullable(client.batchAnnotateImages(singletonList(request)));
}
Тест:
class VisionClientSpec extends Specification {
def "The client should use Google's client to call Vision API"() {
given:
def googleClientMock = Mock(ImageAnnotatorClient)
def visionClient = new VisionClient(googleClientMock)
def imageMock = Image.newBuilder().build()
when:
def resultOpt = visionClient.getLabelsForImage(imageMock)
then:
1 * googleClientMock.batchAnnotateImages(_ as List) >> null
!resultOpt.isPresent()
}
}
Я ожидаю, что макет просто вернет null
(я знаю, что этот тест не имеет большого смысла).Вместо этого он вызывает com.google.cloud.vision.v1.ImageAnnotatorClient.batchAnnotateImages
, который бросает NPE.