4

我正在尝试为使用 Google 视觉 API 和 lib 的类编写单元AnnotatorImageClient测试google-cloud-vision。问题是我的嘲笑AnnotatorImageClient由于某种原因仍然调用了真正的batchAnnotateImages方法,然后抛出了一个 NPE,这打破了我的测试。我以前从未在模拟中看到过这种行为,我想知道我是否做错了什么,spock/groovy 中是否存在错误,或者它是否与该 Google 库有关?

我已经检查过我班级中使用的对象是否真的是一个模拟对象,它就是。我尝试过使用 Spock 版本 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.batchAnnotateImageswhich 抛出 NPE。

4

2 回答 2

4

ImageAnnotatorClient是用 Java 编写的,方法batchAnnotateImages(List<AnnotateImageRequest> requests)final.

Spock 能够模拟 Java 最终类,但在模拟 Java 最终方法方面不是很好。

你可以使用PowerMock来获得你需要的东西,这里是如何让它与 Spock 一起工作的教程。

于 2019-04-08T10:24:10.770 回答
0

SpringBean就我而言,我必须用这个导入来注释模拟字段;

import org.spockframework.spring.SpringBean

于 2021-05-12T06:29:20.620 回答