簡體   English   中英

與 Spock 的 Spring Boot 集成測試:存根方法返回 null

[英]Spring Boot integration test with Spock: stubbed method returns null

我正在使用 Pi4j 為樹莓派創建一個 Java 應用程序。

由於缺少 GPIO 驅動程序,應用程序無法運行 raspbian 操作系統。 這就是為什么當我運行我的 spock 集成測試時,我需要模擬/存根一個依賴於原始 Pi4j API 的 bean。 我的問題是 bean 本身被模擬了,但是存根方法返回 null 而不是我定義的值。

@SpringBootTest
class RoboApplicationTest extends Specification {

    @Autowired
    ApplicationContext context

    @SpringBean
    GpioController gpioController = Stub()

    def "test context loads"() {
        given:
        gpioController.provisionDigitalInputPin(_, _, _) >> { throw new RuntimeException("I'm stubbed!") }

        expect:
        context != null
        context.containsBean('gpioController')
    }
}

我沒有拋出異常或返回任何東西,而是將“provisionDigitalInputPin”方法返回 null,這會導致進一步的 NPE。

你可以在這里找到整個應用程序: https ://github.com/ahlinist/raspberry-pi4j/tree/feature/integration-tests

我正在嘗試實現此處描述的結果: https ://github.com/spockframework/spock/blob/master/spock-spring/boot-test/src/test/groovy/org/spockframework/boot/SpringBeanIntegrationSpec.groovy

我嘗試了很多方法都沒有結果。 與 Mockito 的類似測試效果很好。 我錯過了什么?

更新:運行集成測試執行:

./gradlew integrationTest

更新 2:相應的Spock 票證#1084已在 GitHub 上創建。

當我克隆你的項目並運行測試時,我還看到了一個 NPE,...

java.lang.IllegalStateException: Failed to execute ApplicationRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:778) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
    (...)
Caused by: java.lang.NullPointerException: null
    at robot.controller.impl.RaspberryPiInputImpl.addListener(RaspberryPiInputImpl.java:19) ~[main/:na]
    at robot.sensor.AbstractSensor.init(AbstractSensor.java:21) ~[main/:na]
    at robot.TwoWheelRobot.init(TwoWheelRobot.java:20) ~[main/:na]
    at robot.RoboApplication.run(RoboApplication.java:26) ~[main/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:775) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
    ... 61 common frames omitted

...但不是在你的測試中而是在這個類中:

package robot.controller.impl;

import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;
import lombok.RequiredArgsConstructor;
import robot.controller.Input;
import robot.controller.Listener;

@RequiredArgsConstructor
public class RaspberryPiInputImpl implements Input {

    private final GpioPinDigitalInput gpioPinDigitalInput;

    @Override
    public void addListener(Listener listener) {
        GpioPinListenerDigital gpioListener = (GpioPinListenerDigital) listener;
        gpioPinDigitalInput.addListener(gpioListener);
    }
}

你有一個永遠不會被初始化的最終GpioPinDigitalInput字段,即它永遠是null 那么在調用addListener(..)時,除了 NPE,您還期望什么? 也許你應該在那里注入一個價值......

此外,我必須將測試從src/integration-test移動到src/test ,否則 Gradle 不會運行它,IntelliJ IDEA 也不會將其識別為測試類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM