我正在使用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
我想念什么?
[当我克隆您的项目并运行测试时,我还会看到一个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也无法将其识别为测试类。