Spock集成测试存根方法返回null

问题描述 投票:0回答:1

我正在使用Pi4j为树莓派创建Java应用。

由于缺少适当的GPIO驱动程序,因此应用程序无法在raspbian OS上用尽。这就是为什么当我运行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

我想念什么?

java raspberry-pi integration-testing raspbian spock
1个回答
0
投票

[当我克隆您的项目并运行测试时,我还会看到一个NPE,但不是在您的测试中,而是在this class中:

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也无法将其识别为测试类。

© www.soinside.com 2019 - 2024. All rights reserved.