WireMock在Maven构建时抛空指针,JUnit本地运行正常
解决WireMock 2.6.0在Maven构建时的JsonMappingException/NullPointerException问题
问题诊断
从报错信息和你提供的代码、映射文件来看,核心问题出在WireMock 2.6.0版本对equalToJson匹配器的语法要求上。你当前的映射文件中,直接将JSON对象嵌套在equalToJson字段下,但WireMock 2.6.0要求这个字段的值必须是JSON字符串而非对象,这就导致Jackson解析时抛出NullPointerException,进而触发JsonMappingException。
至于为什么Eclipse中运行JUnit测试正常,大概率是因为Eclipse的类路径中意外引入了更高版本的WireMock依赖(高版本支持直接嵌套JSON对象的语法),而Maven构建时严格使用了你指定的2.6.0版本,二者解析逻辑不一致导致了差异。
修复方案
方案1:适配WireMock 2.6.0的语法要求
修改你的映射文件,将equalToJson对应的JSON对象转换为转义后的JSON字符串:
{ "request":{ "method":"POST", "headers":{ "Authorization":{ "contains":"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhel9hdHRyIjp7ImFwcGxpY2F0aW9uX25hbWUiOiJSZWdTZXJ2aWNlIiwiYXBwbGljYXRpb25faWQiOiJCQ1MifSwiemlkIjoic2FwLWljYnMiLCJ1c2VyX2lkIjoidGVzdFVzZXIiLCJ1c2VyX25hbWUiOiJ1c2VyIG5hbWUiLCJzY29wZSI6WyJ1YWEtc2VydmljZS1iY3MuQnVzQ29uZmlnbk1hbmFnZUNvbnRlbnQiXSwiZXhwIjoyMTQ3NDgzNjQ3LCJjbGllbnRfaWQiOiJzYi1CQ1NTZXJ2aWNlIiwiZW1haWwiOiJ0ZXN0VXNlckB0ZXN0T3JnIiwiY2lkIjoic2ItQkNTU2VydmljZSJ9.ax5hEOLjmazyXKak9GHnQ3ZswQbL2rkRv2fM6p5rD3NPeUKPO6IaXTImGNCwk3wk6UbkTXuQu8rOQzHugvMLajYwFTpeMuOMjCZ-B8MgrNZq2EKiKe6aQKfzZ6vJZkPWon2UuZWNfKFxbBtglcVi4rL4Z655IWu4zWJ9_r6ruHVybW8eU4hD-4UNdJB2m4pISJw1usqA-_GaMMfQ5j6azx93m1qHuWUYMMmTtq_JefHiA4FueYHh4cBj-aHvTa_PYkG8rg0qY6dvJPw1R9ANKNG5CsQZmzUsY3a9KZX5wgRoSYshePj25mR1GmOzb8PCIDUmyWST-_keF0OnnqJhyQ" }, "Content-Type":{ "contains":"application/json" }, "Accept-Language":{ "contains":"en" } }, "url":"/busconfig/validate", "bodyPatterns":[ { "equalToJson": "{\"serviceEntities\":{\"OrderType\":{\"data\":[{\"Code\":\"TE\",\"BusConfignIsDeleted\":false,\"BusConfignValidStart\":\"/Date(1571356800000)/\",\"BusConfignValidEnd\":\"/Date(1571356800000)/\"},{\"Code\":\"YZ\",\"BusConfignIsDeleted\":false,\"BusConfignValidStart\":\"/Date(1572739200000)/\",\"BusConfignValidEnd\":\"/Date(1575072000000)/\"}],\"entityEndPoint\":\"SalesOrderOrderTypeService/OrderType\"},\"OrderTypeText\":{\"data\":[{\"Code\":\"TE\",\"BusConfignIsDeleted\":false,\"LanguageCode\":\"en\",\"LanguageName\":\"English\",\"Description\":\"TE Desc\"},{\"Code\":\"YZ\",\"BusConfignIsDeleted\":false,\"LanguageCode\":\"en\",\"Description\":\"Validation error code\"}],\"dependency\":[\"OrderType\"],\"entityEndPoint\":\"SalesOrderOrderTypeService/OrderTypeText\"}},\"required\":[\"OrderType\",\"OrderTypeText\"],\"description\":\"Check\",\"changeType\":\"m\"}" } ] }, "response":{ "status":200 } }
注意:所有内部的双引号都需要用反斜杠\转义,确保整个内容是一个合法的JSON字符串。
方案2:升级WireMock版本(推荐)
如果可以升级依赖,建议将WireMock版本升级到2.27.0及以上,这些版本支持直接在equalToJson字段下嵌套JSON对象的语法,无需转义字符串。修改你的Maven依赖:
<dependency> <groupId>com.github.tomakehurst</groupId> <artifactId>wiremock-standalone</artifactId> <version>2.27.0</version> <scope>test</scope> </dependency>
升级后,你当前的映射文件无需修改即可正常工作。
额外验证步骤
- 清理Maven本地仓库中WireMock的缓存:执行
mvn clean install -U,强制更新依赖,确保Maven使用的是指定版本的WireMock。 - 检查Eclipse的项目依赖:右键项目 →
Build Path→Configure Build Path,确认WireMock的版本和Maven中指定的一致,避免类路径冲突。
内容的提问来源于stack exchange,提问作者Madhusudan Sahu
相关产品推荐
相关产品推荐

