Groovy Spock mock, вызывающий реальный метод mocked класса - PullRequest
2 голосов
/ 08 апреля 2019

Я пытаюсь написать модульный тест для класса, который использует 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.

1 Ответ

0 голосов
/ 08 апреля 2019

Класс ImageAnnotatorClient написан на Java, а метод batchAnnotateImages(List<AnnotateImageRequest> requests) равен final.

Спок умеет насмехаться над финальными классами Java, но не очень хорош в насмешке над финальными методами Java.

Вы можете использовать PowerMock , чтобы получить то, что вам нужно, здесь - учебник, как заставить его работать вместе со Споком.

...