Groovy Spock模拟调用模拟类的真实方法

时间:2019-04-08 08:05:36

标签: java groovy mocking spock vision-api

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

我已经检查了类中使用的对象是否真的是模拟对象。我已经尝试过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.batchAnnotateImages并引发NPE。

2 个答案:

答案 0 :(得分:0)

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

Spock能够模拟Java最终类,但是在模拟Java最终方法方面却不那么出色。

您可以使用PowerMock来获取所需的内容,here是如何与Spock一起使用的教程。

答案 1 :(得分:0)

就我而言,我必须使用 SpringBean 对模拟字段进行注释;

import org.spockframework.spring.SpringBean