我使用 SpringCloud 对 Azure Functions 测试服务的 junit 测试得到了一个相当无用的 NullPointerException。我在这方面完全是新手,所以如果这看起来很明显,我深表歉意。
堆栈跟踪:
java.lang.NullPointerException
at org.springframework.cloud.function.adapter.azure.AzureSpringBootRequestHandler.doResolveName(AzureSpringBootRequestHandler.java:86)
at org.springframework.cloud.function.context.AbstractSpringFunctionAdapterInitializer.initFunctionConsumerOrSupplierFromCatalog(AbstractSpringFunctionAdapterInitializer.java:387)
at org.springframework.cloud.function.context.AbstractSpringFunctionAdapterInitializer.initialize(AbstractSpringFunctionAdapterInitializer.java:124)
at org.springframework.cloud.function.adapter.azure.AzureSpringBootRequestHandler.handleRequest(AzureSpringBootRequestHandler.java:58)
at test.TestCloud.start(TestCloud.java:42)
我认为 NPE 可能是由于我将 null 传递给 handleRequest 的第二个参数引起的,但这就是我查看的示例正在做的事情。我已经使用我制作的具体扩展或通用版本尝试了注释行或它下面的行。两者的行为相同,并且控制永远不会到达执行方法。该示例使用泛型类,但具体实现对我来说似乎更有意义(否则我看不到连接是如何建立的)。
@Test
public void start() throws Exception {
// AzureSpringBootRequestHandler<String, String> handler = new AzureSpringBootRequestHandler<String, String>(CloudFunctionApplication.class);
AzureReverseAdapter handler = new AzureReverseAdapter(CloudFunctionApplication.class);
String result = handler.handleRequest("Hello World", null);
handler.close();
Assert.assertEquals(result, "dlroW olleH");
}
测试类现在只有一个函数,它在下面。
@FunctionName("reverseString")
public String execute(@HttpTrigger(name = "request", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request, ExecutionContext context) {
context.getLogger().info("Input: " + request.getBody().get());
return handleRequest(request.getBody().get(), context);
}
CloudFunctionApplication 类具有如下所示的方法。奇怪的是,我不知道怎么做,但控制确实达到了这个功能。我认为执行方法应该充当重定向,但无论如何它似乎找到了reserveString。我猜是因为它是唯一的@FunctionName?
这就是方法。return(value) -> { 行上的断点被断点击中,但异常发生在调用内部之前。
@Bean
public Function<String, String> reverseString() {
return (value) -> {
return new StringBuilder(value).reverse().toString();
};
}
更新:链接的问题绝对不是这个问题的重复。是的,所有 NullPointerExceptions 都是因为当您尝试取消引用它时某些内容为空。该链接是对此的通用处理。这是一个关于我为什么从 3rd 方库中获得它的具体问题。所以它们绝对不一样。
但是,我发现了评论中建议的问题。那是我将 null 作为第二个参数传入。这似乎是允许的,因为我正在研究的示例也是如此。我的解决方案是模拟制造一个返回基本值的 ExecutionContext 对象。不幸的是,我无法将其记录为答案,因为有人认为我只是在问 NullPointerException 是什么并将该问题标记为欺骗。
所以对于遇到同样问题的其他人来说,这就是我的答案。