解决:Provider com.sun.xml.stream.ZephyrWriterFactory not found

微服务A部署报错及解决方案
本文记录了在Linux服务器上使用apache-tomcat-8.5.57部署微服务A时遇到的错误:java.util.ServiceConfigurationError,并详细描述了解决过程,通过添加sjsxp-1.0.2.jar成功解决问题。

备忘录:为查询和总结记录。
记录:NO.234
记录:重复试错,怀疑人生。
本例环境:
        IDEA版本:IntelliJ IDEA 2019.3.3 x64
        操作系统:CentOS 7
        JDK版本:jdk-8u251-linux-x64
        Tomcat8:apache-tomcat-8.5.57
场景:
        微服务A部署到Linux服务器的apache-tomcat-8.5.57中运行报错。
报错信息:
        java.util.ServiceConfigurationError: javax.xml.stream.XMLOutputFactory: Provider com.sun.xml.stream.ZephyrWriterFactory not found 
解决:
        在微服务中添加sjsxp-1.0.2.jar,问题解决。
以上,感谢。

D:\software\Java\jdk1.8.0_451\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.7\lib\idea_rt.jar=7917:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.7\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.7\lib\idea_rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.7\plugins\junit\lib\junit5-rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.7\plugins\junit\lib\junit-rt.jar;D:\software\Java\jdk1.8.0_451\jre\lib\charsets.jar;D:\software\Java\jdk1.8.0_451\jre\lib\deploy.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\access-bridge-64.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\cldrdata.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\dnsns.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\jaccess.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\localedata.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\nashorn.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\sunec.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\sunjce_provider.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\sunmscapi.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\sunpkcs11.jar;D:\software\Java\jdk1.8.0_451\jre\lib\ext\zipfs.jar;D:\software\Java\jdk1.8.0_451\jre\lib\javaws.jar;D:\software\Java\jdk1.8.0_451\jre\lib\jce.jar;D:\software\Java\jdk1.8.0_451\jre\lib\jfr.jar;D:\software\Java\jdk1.8.0_451\jre\lib\jsse.jar;D:\software\Java\jdk1.8.0_451\jre\lib\management-agent.jar;D:\software\Java\jdk1.8.0_451\jre\lib\plugin.jar;D:\software\Java\jdk1.8.0_451\jre\lib\resources.jar;D:\software\Java\jdk1.8.0_451\jre\lib\rt.jar;D:\workspace\git_localrepo\access-control\person\person-core\target\test-classes;D:\workspace\git_localrepo\access-control\person\person-core\target\classes;D:\workspace\git_localrepo\access-control\person\person-api\target\classes;D:\workspace\git_localrepo\access-control\person\person-port-repository-api\target\classes;F:\Program Files\repository\org\springframework\data\spring-data-mongodb\3.4.7\spring-data-mongodb-3.4.7.jar;F:\Program Files\repository\org\springframework\spring-tx\5.3.25\spring-tx-5.3.25.jar;F:\Program Files\repository\org\springframework\spring-context\5.3.25\spring-context-5.3.25.jar;F:\Program Files\repository\org\springframework\spring-aop\5.3.25\spring-aop-5.3.25.jar;F:\Program Files\repository\org\springframework\spring-beans\5.3.25\spring-beans-5.3.25.jar;F:\Program Files\repository\org\springframework\spring-core\5.3.25\spring-core-5.3.25.jar;F:\Program Files\repository\org\springframework\spring-jcl\5.3.25\spring-jcl-5.3.25.jar;F:\Program Files\repository\org\springframework\spring-expression\5.3.25\spring-expression-5.3.25.jar;F:\Program Files\repository\org\springframework\data\spring-data-commons\2.7.7\spring-data-commons-2.7.7.jar;F:\Program Files\repository\org\mongodb\mongodb-driver-core\4.6.1\mongodb-driver-core-4.6.1.jar;F:\Program Files\repository\org\mongodb\bson\4.6.1\bson-4.6.1.jar;F:\Program Files\repository\org\mongodb\bson-record-codec\4.6.1\bson-record-codec-4.6.1.jar;F:\Program Files\repository\com\tplink\cdd\vigi-common-mongo\2.0.105-SNAPSHOT\vigi-common-mongo-2.0.105-SNAPSHOT.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-data-mongodb\2.7.8\spring-boot-starter-data-mongodb-2.7.8.jar;F:\Program Files\repository\org\mongodb\mongodb-driver-sync\4.6.1\mongodb-driver-sync-4.6.1.jar;F:\Program Files\repository\com\tplink\cdd\vigi-common-eventbus\2.0.105-SNAPSHOT\vigi-common-eventbus-2.0.105-SNAPSHOT.jar;F:\Program Files\repository\com\tplink\smb\eventcenter.api\1.4.5\eventcenter.api-1.4.5.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter\2.7.8\spring-boot-starter-2.7.8.jar;F:\Program Files\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;F:\Program Files\repository\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-log4j2\2.7.8\spring-boot-starter-log4j2-2.7.8.jar;F:\Program Files\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;F:\Program Files\repository\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;F:\Program Files\repository\org\apache\logging\log4j\log4j-slf4j-impl\2.17.2\log4j-slf4j-impl-2.17.2.jar;F:\Program Files\repository\org\apache\logging\log4j\log4j-core\2.17.2\log4j-core-2.17.2.jar;F:\Program Files\repository\org\apache\logging\log4j\log4j-jul\2.17.2\log4j-jul-2.17.2.jar;F:\Program Files\repository\org\projectlombok\lombok\1.18.24\lombok-1.18.24.jar;F:\Program Files\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;F:\Program Files\repository\com\tplink\cdd\vigi-common-tpcloud\2.0.105-SNAPSHOT\vigi-common-tpcloud-2.0.105-SNAPSHOT.jar;F:\Program Files\repository\com\tplink\nbu\common\platform-cloud-sdk\2.1.60\platform-cloud-sdk-2.1.60.jar;F:\Program Files\repository\org\apache\httpcomponents\httpasyncclient\4.1.5\httpasyncclient-4.1.5.jar;F:\Program Files\repository\org\apache\httpcomponents\httpcore-nio\4.4.16\httpcore-nio-4.4.16.jar;F:\Program Files\repository\com\tplink\account-api-sdk\1.3.172\account-api-sdk-1.3.172.jar;F:\Program Files\repository\com\tplink\platform\common-grpc\1.0.4\common-grpc-1.0.4.jar;F:\Program Files\repository\com\google\protobuf\protobuf-java\3.19.2\protobuf-java-3.19.2.jar;F:\Program Files\repository\com\tplink\nbu\common\pii-mask-spring-boot-autoconfigure\2.1.51\pii-mask-spring-boot-autoconfigure-2.1.51.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-web\2.7.8\spring-boot-starter-web-2.7.8.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-json\2.7.8\spring-boot-starter-json-2.7.8.jar;F:\Program Files\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.4\jackson-datatype-jdk8-2.13.4.jar;F:\Program Files\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.4\jackson-module-parameter-names-2.13.4.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-tomcat\2.7.8\spring-boot-starter-tomcat-2.7.8.jar;F:\Program Files\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.71\tomcat-embed-websocket-9.0.71.jar;F:\Program Files\repository\org\springframework\spring-webmvc\5.3.25\spring-webmvc-5.3.25.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-validation\2.7.8\spring-boot-starter-validation-2.7.8.jar;F:\Program Files\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.71\tomcat-embed-el-9.0.71.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-starter-actuator\2.7.8\spring-boot-starter-actuator-2.7.8.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\2.7.8\spring-boot-actuator-autoconfigure-2.7.8.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-actuator\2.7.8\spring-boot-actuator-2.7.8.jar;F:\Program Files\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.4\jackson-datatype-jsr310-2.13.4.jar;F:\Program Files\repository\com\hubspot\jackson\jackson-datatype-protobuf\0.9.15\jackson-datatype-protobuf-0.9.15.jar;F:\Program Files\repository\com\google\protobuf\protobuf-java-util\3.19.3\protobuf-java-util-3.19.3.jar;F:\Program Files\repository\com\google\code\findbugs\annotations\3.0.1\annotations-3.0.1.jar;F:\Program Files\repository\com\tplink\account-sdk\1.3.172\account-sdk-1.3.172.jar;F:\Program Files\repository\com\tplink\account\auth-sdk\1.1.621\auth-sdk-1.1.621.jar;F:\Program Files\repository\com\tplink\common\mail-sdk\1.1.507\mail-sdk-1.1.507.jar;F:\Program Files\repository\org\springframework\spring-web\5.3.25\spring-web-5.3.25.jar;F:\Program Files\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.71\tomcat-embed-core-9.0.71.jar;F:\Program Files\repository\org\apache\tomcat\tomcat-annotations-api\9.0.71\tomcat-annotations-api-9.0.71.jar;F:\Program Files\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;F:\Program Files\repository\org\hibernate\validator\hibernate-validator\6.2.5.Final\hibernate-validator-6.2.5.Final.jar;F:\Program Files\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;F:\Program Files\repository\org\jboss\logging\jboss-logging\3.4.3.Final\jboss-logging-3.4.3.Final.jar;F:\Program Files\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;F:\Program Files\repository\com\tplink\cdd\common\components-email-cloud-platform\1.0.11\components-email-cloud-platform-1.0.11.jar;F:\Program Files\repository\com\tplink\cdd\common\components-email-api\1.0.11\components-email-api-1.0.11.jar;F:\Program Files\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;F:\Program Files\repository\com\tplink\cdd\common\components-email-common\1.0.11\components-email-common-1.0.11.jar;F:\Program Files\repository\com\tplink\smb\solution-components-lock-api\1.1.5\solution-components-lock-api-1.1.5.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-autoconfigure\2.7.8\spring-boot-autoconfigure-2.7.8.jar;F:\Program Files\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;F:\Program Files\repository\com\tplink\smb\solution-components-cache-api\1.4.3\solution-components-cache-api-1.4.3.jar;F:\Program Files\repository\com\tplink\smb\solution-components-cache-mem\1.4.3\solution-components-cache-mem-1.4.3.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-configuration-processor\2.7.8\spring-boot-configuration-processor-2.7.8.jar;F:\Program Files\repository\com\github\ben-manes\caffeine\caffeine\2.9.3\caffeine-2.9.3.jar;F:\Program Files\repository\org\checkerframework\checker-qual\3.19.0\checker-qual-3.19.0.jar;F:\Program Files\repository\com\google\errorprone\error_prone_annotations\2.10.0\error_prone_annotations-2.10.0.jar;F:\Program Files\repository\com\tplink\smb\solution-component-storage-api\1.4.10\solution-component-storage-api-1.4.10.jar;F:\Program Files\repository\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;F:\Program Files\repository\com\tplink\smb\solution-component-storage-port-s3\1.4.10\solution-component-storage-port-s3-1.4.10.jar;F:\Program Files\repository\com\amazonaws\aws-java-sdk-s3\1.12.415\aws-java-sdk-s3-1.12.415.jar;F:\Program Files\repository\com\amazonaws\aws-java-sdk-kms\1.12.415\aws-java-sdk-kms-1.12.415.jar;F:\Program Files\repository\com\amazonaws\aws-java-sdk-core\1.12.415\aws-java-sdk-core-1.12.415.jar;F:\Program Files\repository\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;F:\Program Files\repository\software\amazon\ion\ion-java\1.0.2\ion-java-1.0.2.jar;F:\Program Files\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-cbor\2.13.4\jackson-dataformat-cbor-2.13.4.jar;F:\Program Files\repository\joda-time\joda-time\2.8.1\joda-time-2.8.1.jar;F:\Program Files\repository\com\amazonaws\jmespath-java\1.12.415\jmespath-java-1.12.415.jar;F:\Program Files\repository\com\amazonaws\aws-java-sdk-sts\1.12.415\aws-java-sdk-sts-1.12.415.jar;F:\Program Files\repository\org\bouncycastle\bcprov-jdk15on\1.68\bcprov-jdk15on-1.68.jar;F:\Program Files\repository\com\tplink\cdd\vigi-common-algorithm\2.0.105-SNAPSHOT\vigi-common-algorithm-2.0.105-SNAPSHOT.jar;F:\Program Files\repository\com\amazonaws\aws-java-sdk-lambda\1.11.923\aws-java-sdk-lambda-1.11.923.jar;F:\Program Files\repository\com\tplink\smb\eventcenter.kafka\1.4.5\eventcenter.kafka-1.4.5.jar;F:\Program Files\repository\com\tplink\smb\eventcenter.core\1.4.5\eventcenter.core-1.4.5.jar;F:\Program Files\repository\org\springframework\kafka\spring-kafka\2.8.11\spring-kafka-2.8.11.jar;F:\Program Files\repository\org\springframework\spring-messaging\5.3.25\spring-messaging-5.3.25.jar;F:\Program Files\repository\org\springframework\retry\spring-retry\1.3.4\spring-retry-1.3.4.jar;F:\Program Files\repository\org\apache\kafka\kafka-clients\3.1.2\kafka-clients-3.1.2.jar;F:\Program Files\repository\com\github\luben\zstd-jni\1.5.0-4\zstd-jni-1.5.0-4.jar;F:\Program Files\repository\org\lz4\lz4-java\1.8.0\lz4-java-1.8.0.jar;F:\Program Files\repository\org\xerial\snappy\snappy-java\1.1.8.4\snappy-java-1.1.8.4.jar;F:\Program Files\repository\io\micrometer\micrometer-core\1.9.7\micrometer-core-1.9.7.jar;F:\Program Files\repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;F:\Program Files\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;F:\Program Files\repository\io\github\resilience4j\resilience4j-circuitbreaker\1.3.0\resilience4j-circuitbreaker-1.3.0.jar;F:\Program Files\repository\io\vavr\vavr\0.10.2\vavr-0.10.2.jar;F:\Program Files\repository\io\vavr\vavr-match\0.10.2\vavr-match-0.10.2.jar;F:\Program Files\repository\io\github\resilience4j\resilience4j-core\1.3.0\resilience4j-core-1.3.0.jar;F:\Program Files\repository\com\fasterxml\jackson\core\jackson-databind\2.13.4.2\jackson-databind-2.13.4.2.jar;F:\Program Files\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.4\jackson-annotations-2.13.4.jar;F:\Program Files\repository\com\fasterxml\jackson\core\jackson-core\2.13.4\jackson-core-2.13.4.jar;F:\Program Files\repository\com\esotericsoftware\kryo\5.5.0\kryo-5.5.0.jar;F:\Program Files\repository\com\esotericsoftware\reflectasm\1.11.9\reflectasm-1.11.9.jar;F:\Program Files\repository\com\esotericsoftware\minlog\1.3.1\minlog-1.3.1.jar;F:\Program Files\repository\com\tplink\smb\solution-components-lock-mem\1.3.4\solution-components-lock-mem-1.3.4.jar;F:\Program Files\repository\net\coobird\thumbnailator\0.4.20\thumbnailator-0.4.20.jar;F:\Program Files\repository\com\github\gotson\webp-imageio\0.2.2\webp-imageio-0.2.2.jar;F:\Program Files\repository\com\tplink\cdd\vigi-common\2.0.105-SNAPSHOT\vigi-common-2.0.105-SNAPSHOT.jar;F:\Program Files\repository\com\google\guava\guava\29.0-jre\guava-29.0-jre.jar;F:\Program Files\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;F:\Program Files\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;F:\Program Files\repository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;F:\Program Files\repository\org\json\json\20230227\json-20230227.jar;F:\Program Files\repository\cn\hutool\hutool-core\5.8.15\hutool-core-5.8.15.jar;F:\Program Files\repository\cn\hutool\hutool-crypto\5.8.15\hutool-crypto-5.8.15.jar;F:\Program Files\repository\org\springframework\boot\spring-boot\2.7.8\spring-boot-2.7.8.jar;F:\Program Files\repository\io\micrometer\micrometer-registry-prometheus\1.9.7\micrometer-registry-prometheus-1.9.7.jar;F:\Program Files\repository\io\prometheus\simpleclient_common\0.15.0\simpleclient_common-0.15.0.jar;F:\Program Files\repository\io\prometheus\simpleclient\0.15.0\simpleclient-0.15.0.jar;F:\Program Files\repository\io\prometheus\simpleclient_tracer_otel\0.15.0\simpleclient_tracer_otel-0.15.0.jar;F:\Program Files\repository\io\prometheus\simpleclient_tracer_common\0.15.0\simpleclient_tracer_common-0.15.0.jar;F:\Program Files\repository\io\prometheus\simpleclient_tracer_otel_agent\0.15.0\simpleclient_tracer_otel_agent-0.15.0.jar;F:\Program Files\repository\com\tplink\nbu\common\nbu-common-utils\2.1.60\nbu-common-utils-2.1.60.jar;F:\Program Files\repository\org\softee\pojo-mbean\1.1\pojo-mbean-1.1.jar;F:\Program Files\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;F:\Program Files\repository\com\tplink\nbu\common\pii\2.1.60\pii-2.1.60.jar;F:\Program Files\repository\com\jayway\jsonpath\json-path\2.7.0\json-path-2.7.0.jar;F:\Program Files\repository\net\minidev\json-smart\2.4.8\json-smart-2.4.8.jar;F:\Program Files\repository\net\minidev\accessors-smart\2.4.8\accessors-smart-2.4.8.jar;F:\Program Files\repository\org\ow2\asm\asm\9.1\asm-9.1.jar;F:\Program Files\repository\javax\servlet\javax.servlet-api\4.0.1\javax.servlet-api-4.0.1.jar;F:\Program Files\repository\io\netty\netty-all\4.1.87.Final\netty-all-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-buffer\4.1.87.Final\netty-buffer-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec\4.1.87.Final\netty-codec-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-dns\4.1.87.Final\netty-codec-dns-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-haproxy\4.1.87.Final\netty-codec-haproxy-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-http\4.1.87.Final\netty-codec-http-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-http2\4.1.87.Final\netty-codec-http2-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-memcache\4.1.87.Final\netty-codec-memcache-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-mqtt\4.1.87.Final\netty-codec-mqtt-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-redis\4.1.87.Final\netty-codec-redis-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-smtp\4.1.87.Final\netty-codec-smtp-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-socks\4.1.87.Final\netty-codec-socks-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-stomp\4.1.87.Final\netty-codec-stomp-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-codec-xml\4.1.87.Final\netty-codec-xml-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-common\4.1.87.Final\netty-common-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-handler\4.1.87.Final\netty-handler-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-native-unix-common\4.1.87.Final\netty-transport-native-unix-common-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-handler-proxy\4.1.87.Final\netty-handler-proxy-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-handler-ssl-ocsp\4.1.87.Final\netty-handler-ssl-ocsp-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-resolver\4.1.87.Final\netty-resolver-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-resolver-dns\4.1.87.Final\netty-resolver-dns-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport\4.1.87.Final\netty-transport-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-rxtx\4.1.87.Final\netty-transport-rxtx-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-sctp\4.1.87.Final\netty-transport-sctp-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-udt\4.1.87.Final\netty-transport-udt-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-classes-epoll\4.1.87.Final\netty-transport-classes-epoll-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-classes-kqueue\4.1.87.Final\netty-transport-classes-kqueue-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-resolver-dns-classes-macos\4.1.87.Final\netty-resolver-dns-classes-macos-4.1.87.Final.jar;F:\Program Files\repository\io\netty\netty-transport-native-epoll\4.1.87.Final\netty-transport-native-epoll-4.1.87.Final-linux-x86_64.jar;F:\Program Files\repository\io\netty\netty-transport-native-epoll\4.1.87.Final\netty-transport-native-epoll-4.1.87.Final-linux-aarch_64.jar;F:\Program Files\repository\io\netty\netty-transport-native-kqueue\4.1.87.Final\netty-transport-native-kqueue-4.1.87.Final-osx-x86_64.jar;F:\Program Files\repository\io\netty\netty-transport-native-kqueue\4.1.87.Final\netty-transport-native-kqueue-4.1.87.Final-osx-aarch_64.jar;F:\Program Files\repository\io\netty\netty-resolver-dns-native-macos\4.1.87.Final\netty-resolver-dns-native-macos-4.1.87.Final-osx-x86_64.jar;F:\Program Files\repository\io\netty\netty-resolver-dns-native-macos\4.1.87.Final\netty-resolver-dns-native-macos-4.1.87.Final-osx-aarch_64.jar;F:\Program Files\repository\commons-io\commons-io\2.11.0\commons-io-2.11.0.jar;F:\Program Files\repository\net\sourceforge\javacsv\javacsv\2.0\javacsv-2.0.jar;F:\Program Files\repository\com\googlecode\java-ipv6\java-ipv6\0.17\java-ipv6-0.17.jar;F:\Program Files\repository\org\apache\poi\poi-ooxml\4.1.2\poi-ooxml-4.1.2.jar;F:\Program Files\repository\org\apache\poi\poi\4.1.2\poi-4.1.2.jar;F:\Program Files\repository\org\apache\commons\commons-collections4\4.4\commons-collections4-4.4.jar;F:\Program Files\repository\org\apache\commons\commons-math3\3.6.1\commons-math3-3.6.1.jar;F:\Program Files\repository\com\zaxxer\SparseBitSet\1.2\SparseBitSet-1.2.jar;F:\Program Files\repository\org\apache\poi\poi-ooxml-schemas\4.1.2\poi-ooxml-schemas-4.1.2.jar;F:\Program Files\repository\org\apache\xmlbeans\xmlbeans\3.1.0\xmlbeans-3.1.0.jar;F:\Program Files\repository\org\apache\commons\commons-compress\1.19\commons-compress-1.19.jar;F:\Program Files\repository\com\github\virtuald\curvesapi\1.06\curvesapi-1.06.jar;F:\Program Files\repository\org\bouncycastle\bcpkix-jdk15on\1.68\bcpkix-jdk15on-1.68.jar;F:\Program Files\repository\org\mapstruct\mapstruct\1.4.2.Final\mapstruct-1.4.2.Final.jar;F:\Program Files\repository\org\mapstruct\mapstruct-processor\1.4.2.Final\mapstruct-processor-1.4.2.Final.jar;F:\Program Files\repository\org\apache\skywalking\apm-toolkit-log4j-2.x\8.1.0\apm-toolkit-log4j-2.x-8.1.0.jar;F:\Program Files\repository\org\apache\skywalking\apm-toolkit-trace\8.1.0\apm-toolkit-trace-8.1.0.jar;F:\Program Files\repository\com\tplink\nbu\skywalking-sdk\1.0.0\skywalking-sdk-1.0.0.jar;F:\Program Files\repository\io\grpc\grpc-netty-shaded\1.27.1\grpc-netty-shaded-1.27.1.jar;F:\Program Files\repository\io\grpc\grpc-core\1.27.1\grpc-core-1.27.1.jar;F:\Program Files\repository\io\grpc\grpc-api\1.27.1\grpc-api-1.27.1.jar;F:\Program Files\repository\io\grpc\grpc-context\1.27.1\grpc-context-1.27.1.jar;F:\Program Files\repository\org\codehaus\mojo\animal-sniffer-annotations\1.18\animal-sniffer-annotations-1.18.jar;F:\Program Files\repository\com\google\code\gson\gson\2.9.1\gson-2.9.1.jar;F:\Program Files\repository\com\google\android\annotations\4.1.1.4\annotations-4.1.1.4.jar;F:\Program Files\repository\io\perfmark\perfmark-api\0.19.0\perfmark-api-0.19.0.jar;F:\Program Files\repository\org\apache\httpcomponents\httpclient\4.5.14\httpclient-4.5.14.jar;F:\Program Files\repository\org\apache\httpcomponents\httpcore\4.4.16\httpcore-4.4.16.jar;F:\Program Files\repository\org\springframework\boot\spring-boot-test\2.7.8\spring-boot-test-2.7.8.jar;F:\Program Files\repository\org\mockito\mockito-core\3.7.7\mockito-core-3.7.7.jar;F:\Program Files\repository\net\bytebuddy\byte-buddy\1.12.22\byte-buddy-1.12.22.jar;F:\Program Files\repository\net\bytebuddy\byte-buddy-agent\1.12.22\byte-buddy-agent-1.12.22.jar;F:\Program Files\repository\org\mockito\mockito-inline\3.7.7\mockito-inline-3.7.7.jar;F:\Program Files\repository\org\powermock\powermock-module-junit4\2.0.0\powermock-module-junit4-2.0.0.jar;F:\Program Files\repository\org\powermock\powermock-module-junit4-common\2.0.0\powermock-module-junit4-common-2.0.0.jar;F:\Program Files\repository\org\powermock\powermock-reflect\2.0.0\powermock-reflect-2.0.0.jar;F:\Program Files\repository\org\powermock\powermock-core\2.0.0\powermock-core-2.0.0.jar;F:\Program Files\repository\org\javassist\javassist\3.24.0-GA\javassist-3.24.0-GA.jar;F:\Program Files\repository\junit\junit\4.13.2\junit-4.13.2.jar;F:\Program Files\repository\org\hamcrest\hamcrest-core\2.2\hamcrest-core-2.2.jar;F:\Program Files\repository\org\hamcrest\hamcrest\2.2\hamcrest-2.2.jar;F:\Program Files\repository\org\powermock\powermock-api-mockito2\2.0.0\powermock-api-mockito2-2.0.0.jar;F:\Program Files\repository\org\powermock\powermock-api-support\2.0.0\powermock-api-support-2.0.0.jar;F:\Program Files\repository\org\objenesis\objenesis\2.6\objenesis-2.6.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest java.lang.RuntimeException: Failed to reset static mocks at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.resetStaticMocks(ExportPersonServiceTest.java:86) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.tearDown(ExportPersonServiceTest.java:75) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.internal.runners.MethodRoadie.runAfters(MethodRoadie.java:150) at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:102) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117) at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57) at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Caused by: org.powermock.reflect.exceptions.FieldNotFoundException: No static field named "INSTANCE" could be found in the class hierarchy of org.powermock.core.MockRepository. at org.powermock.reflect.internal.matcherstrategies.FieldNameMatcherStrategy.notFound(FieldNameMatcherStrategy.java:40) at org.powermock.reflect.internal.WhiteboxImpl.findSingleFieldUsingStrategy(WhiteboxImpl.java:501) at org.powermock.reflect.internal.WhiteboxImpl.findFieldInHierarchy(WhiteboxImpl.java:454) at org.powermock.reflect.internal.WhiteboxImpl.findFieldInHierarchy(WhiteboxImpl.java:442) at org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.java:426) at org.powermock.reflect.Whitebox.getInternalState(Whitebox.java:292) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.resetStaticMocks(ExportPersonServiceTest.java:83) ... 32 more java.lang.NullPointerException at com.tplink.cdd.vms.person.core.domain.person.ExportPersonService.lambda$null$0(ExportPersonService.java:143) at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174) at java.util.HashMap$EntrySpliterator.forEachRemaining(HashMap.java:1723) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonService.lambda$getGroupName$2(ExportPersonService.java:143) at java.util.ArrayList.forEach(ArrayList.java:1259) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonService.getGroupName(ExportPersonService.java:140) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonService.exportFromServer(ExportPersonService.java:90) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.testExportFromServer_SuccessWithoutCard(ExportPersonServiceTest.java:137) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326) at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89) at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117) at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57) at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) java.lang.RuntimeException: Failed to reset static mocks at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.resetStaticMocks(ExportPersonServiceTest.java:86) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.tearDown(ExportPersonServiceTest.java:75) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.internal.runners.MethodRoadie.runAfters(MethodRoadie.java:150) at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:102) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117) at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57) at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Caused by: org.powermock.reflect.exceptions.FieldNotFoundException: No static field named "INSTANCE" could be found in the class hierarchy of org.powermock.core.MockRepository. at org.powermock.reflect.internal.matcherstrategies.FieldNameMatcherStrategy.notFound(FieldNameMatcherStrategy.java:40) at org.powermock.reflect.internal.WhiteboxImpl.findSingleFieldUsingStrategy(WhiteboxImpl.java:501) at org.powermock.reflect.internal.WhiteboxImpl.findFieldInHierarchy(WhiteboxImpl.java:454) at org.powermock.reflect.internal.WhiteboxImpl.findFieldInHierarchy(WhiteboxImpl.java:442) at org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.java:426) at org.powermock.reflect.Whitebox.getInternalState(Whitebox.java:292) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.resetStaticMocks(ExportPersonServiceTest.java:83) ... 32 more java.lang.NullPointerException at com.tplink.cdd.vms.person.core.domain.person.ExportPersonService.lambda$null$0(ExportPersonService.java:143) at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174) at java.util.HashMap$EntrySpliterator.forEachRemaining(HashMap.java:1723) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonService.lambda$getGroupName$2(ExportPersonService.java:143) at java.util.ArrayList.forEach(ArrayList.java:1259) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonService.getGroupName(ExportPersonService.java:140) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonService.exportFromServer(ExportPersonService.java:90) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.testExportFromServer_SuccessWithAllFields(ExportPersonServiceTest.java:203) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326) at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89) at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117) at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57) at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) java.lang.RuntimeException: Failed to reset static mocks at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.resetStaticMocks(ExportPersonServiceTest.java:86) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.tearDown(ExportPersonServiceTest.java:75) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.internal.runners.MethodRoadie.runAfters(MethodRoadie.java:150) at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:102) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117) at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57) at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Caused by: org.powermock.reflect.exceptions.FieldNotFoundException: No static field named "INSTANCE" could be found in the class hierarchy of org.powermock.core.MockRepository. at org.powermock.reflect.internal.matcherstrategies.FieldNameMatcherStrategy.notFound(FieldNameMatcherStrategy.java:40) at org.powermock.reflect.internal.WhiteboxImpl.findSingleFieldUsingStrategy(WhiteboxImpl.java:501) at org.powermock.reflect.internal.WhiteboxImpl.findFieldInHierarchy(WhiteboxImpl.java:454) at org.powermock.reflect.internal.WhiteboxImpl.findFieldInHierarchy(WhiteboxImpl.java:442) at org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.java:426) at org.powermock.reflect.Whitebox.getInternalState(Whitebox.java:292) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.resetStaticMocks(ExportPersonServiceTest.java:83) ... 32 more org.mockito.exceptions.base.MockitoException: For com.tplink.cdd.vms.person.core.domain.util.DOAndDTOMapperUtils, static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.testGetCard_Logic(ExportPersonServiceTest.java:238) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326) at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89) at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117) at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57) at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) java.lang.RuntimeException: Failed to reset static mocks at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.resetStaticMocks(ExportPersonServiceTest.java:86) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.tearDown(ExportPersonServiceTest.java:75) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.internal.runners.MethodRoadie.runAfters(MethodRoadie.java:150) at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:102) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117) at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57) at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Caused by: org.powermock.reflect.exceptions.FieldNotFoundException: No static field named "INSTANCE" could be found in the class hierarchy of org.powermock.core.MockRepository. at org.powermock.reflect.internal.matcherstrategies.FieldNameMatcherStrategy.notFound(FieldNameMatcherStrategy.java:40) at org.powermock.reflect.internal.WhiteboxImpl.findSingleFieldUsingStrategy(WhiteboxImpl.java:501) at org.powermock.reflect.internal.WhiteboxImpl.findFieldInHierarchy(WhiteboxImpl.java:454) at org.powermock.reflect.internal.WhiteboxImpl.findFieldInHierarchy(WhiteboxImpl.java:442) at org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.java:426) at org.powermock.reflect.Whitebox.getInternalState(Whitebox.java:292) at com.tplink.cdd.vms.person.core.domain.person.ExportPersonServiceTest.resetStaticMocks(ExportPersonServiceTest.java:83) ... 32 more 进程已结束,退出代码为 -1
最新发布
08-16
<think>根据错误日志,我们遇到了两个主要问题: 1. 在清理静态模拟时,通过反射访问`org.powermock.core.MockRepository`的`INSTANCE`字段失败,因为该字段不存在。 2. 在测试过程中出现了`NullPointerException`,具体在`ExportPersonService`的`getGroupName`方法中。 ### 问题分析 1. **清理静态模拟失败**:PowerMock 2.x 版本中,`MockRepository`类可能没有`INSTANCE`静态字段。因此,我们之前尝试通过反射清理静态模拟的方法不再适用。 2. **空指针异常**:在`ExportPersonService`的`getGroupName`方法中,可能是在处理组映射时出现了空指针。需要检查相关代码逻辑。 ### 解决方案 #### 1. 修复静态模拟清理问题 在PowerMock 2.x中,我们可以使用`PowerMockito.mockStatic`返回的`Mock`对象来重置模拟。但是,更简单且推荐的方式是在每个测试方法结束时使用`PowerMockito.verifyStatic()`和`PowerMockito.reset()`来清理。然而,对于全局清理,我们可以尝试使用`PowerMockito.resetAllMocks()`,但注意它不会重置静态模拟。 实际上,在PowerMock 2.x中,我们可以通过以下方式清理静态模拟: ```java @After public void tearDown() { // 清理所有静态模拟 PowerMockito.mockStatic(DOAndDTOMapperUtils.class); // 重新模拟,然后重置 PowerMockito.reset(DOAndDTOMapperUtils.class); } ``` 但是,这种方法需要知道所有被模拟的静态类,并且可能会影响其他测试。 另一种方法是使用`PowerMockito.clearAllMocks()`(注意:在2.0.9版本中可能有效),但根据之前的信息,这个方法在2.x中已被移除。 考虑到这些,我们可以尝试在`@After`方法中不进行全局清理,而是确保在每个测试方法中正确初始化和清理。具体做法是在每个使用静态模拟的测试方法中,在方法开始时模拟,在方法结束时重置。同时,避免在`@Before`中设置静态模拟。 #### 2. 修复空指针异常 根据错误堆栈,空指针发生在`ExportPersonService`的`getGroupName`方法中,具体位置是lambda表达式内(第143行)。我们需要检查该行代码,确保没有空值参与操作。 ### 修改后的测试类 我们将做以下调整: - 移除自定义的`resetStaticMocks`方法。 - 在`@After`方法中,使用`PowerMockito.reset()`重置需要静态模拟的类(但注意,这要求我们在每个测试方法中重新模拟,因为重置后静态模拟将失效)。 - 或者,我们可以在每个使用静态模拟的测试方法结束时,调用`PowerMockito.reset(DOAndDTOMapperUtils.class)`来清理当前测试的静态模拟。 - 修复`ExportPersonService`中的空指针问题。 ### 步骤 1. 修改`tearDown`方法,使用`PowerMockito.reset()`重置静态模拟的类。 2. 在每个使用静态模拟的测试方法中,在方法开始处进行静态模拟,并在方法结束时重置。 3. 修复`ExportPersonService`中的空指针。 ### 修复空指针 首先,我们检查`ExportPersonService`的`getGroupName`方法(第143行)。根据之前的代码,该行可能是: ```java Map<String, List<GroupDO>> groupIdToGroupList = groupIdList.stream().collect(Collectors.toMap(Function.identity(), id -> groups.stream().filter(group -> group.getId().equals(id)).collect(Collectors.toList()))); ``` 这里可能因为`groups`为null而导致空指针。我们需要确保`groups`不为null,或者使用空集合。 修改建议:在获取组列表后,如果为null,则赋值为空集合。 ### 修改后的测试类代码 ```java package com.tplink.cdd.vms.person.core.domain.person; // ... 导入省略 ... @RunWith(PowerMockRunner.class) @PrepareForTest({DOAndDTOMapperUtils.class, ExportPersonService.class}) public class ExportPersonServicePowerMockTest { // ... 成员变量和@Before方法不变 ... @After public void tearDown() { // 重置静态模拟 PowerMockito.reset(DOAndDTOMapperUtils.class); // 注意:这里重置了,后续测试如果需要使用,需要重新模拟 } // 测试参数校验失败场景 @Test public void testExportFromServer_InvalidParam() { // ... 测试代码不变 ... } // 测试成功导出基础信息(不包含卡片信息) @Test public void testExportFromServer_SuccessWithoutCard() { // 注意:这个方法没有使用静态模拟,所以不需要处理静态模拟的初始化和重置 // ... 测试代码不变 ... } // 测试成功导出包含所有可选字段 @Test public void testExportFromServer_SuccessWithAllFields() { // 初始化静态模拟 mockStatic(DOAndDTOMapperUtils.class); try { // ... 测试代码不变 ... } finally { // 在测试方法结束时重置静态模拟 PowerMockito.reset(DOAndDTOMapperUtils.class); } } // 测试卡片信息获取逻辑 @Test public void testGetCard_Logic() throws Exception { // 初始化静态模拟 mockStatic(DOAndDTOMapperUtils.class); try { // ... 测试代码不变 ... } finally { PowerMockito.reset(DOAndDTOMapperUtils.class); } } // 测试当组映射为空时的处理 @Test public void testGetGroupName_EmptyGroupMapping() throws Exception { // 这个方法没有静态模拟,不需要处理 // ... 测试代码不变 ... } // 辅助方法:创建PersonDO private PersonDO createPersonDO(String id, String firstName, String lastName, String employeeId) { // ... 不变 ... } } ``` ### 修复空指针 在`ExportPersonService`的`getGroupName`方法中,确保`groups`不为null: ```java private void getGroupName(List<PersonDTO> personDTOList, List<String> personIdList, String vmsId) { // ... 获取组映射代码 ... // 获取组列表 List<GroupDO> groups = groupRepository.getGroupListByIdList(vmsId, groupIdList); if (groups == null) { groups = Collections.emptyList(); // 防止null } // ... 后续代码 ... } ``` ### 注意 1. 由于我们使用了`try-finally`来确保每个测试方法结束后重置静态模拟,这样即使测试方法中发生异常,也能正确清理。 2. 在`tearDown`方法中,我们再次重置了静态模拟,这是为了确保万无一失。但注意,如果测试方法中已经重置,这里再次重置可能不会有额外影响,但可能会清除掉其他测试方法中设置的模拟(如果它们没有重新模拟的话)。因此,更安全的做法是只在测试方法内部管理静态模拟的初始化和重置。 ### 另一种方案:使用@Before和@After管理静态模拟 如果多个测试方法都需要模拟同一个静态类,我们可以考虑在`@Before`中初始化静态模拟,在`@After`中重置。但要注意,如果多个测试方法运行在同一个线程中,静态模拟是全局的,所以需要确保每个测试方法运行前都是干净的。因此,我们可以在`@Before`中初始化,在`@After`中重置,这样每个测试方法运行前都会重新初始化。 修改如下: ```java @Before public void setUp() { // ... 其他初始化 ... // 初始化静态模拟(如果所有测试方法都需要) mockStatic(DOAndDTOMapperUtils.class); } @After public void tearDown() { // 重置静态模拟 PowerMockito.reset(DOAndDTOMapperUtils.class); } ``` 但是,这种方法有一个缺点:如果某个测试方法不需要静态模拟,也会进行模拟。另外,如果测试方法中修改了模拟行为,可能会影响其他测试方法(因为静态模拟是全局的)。因此,更推荐在每个测试方法中独立管理静态模拟。 ### 最终选择 鉴于我们的测试中只有部分方法需要静态模拟,我们选择在每个需要静态模拟的测试方法中独立初始化和重置。这样每个测试方法都是独立的,不会相互影响。 ### 修改后的测试方法示例 ```java @Test public void testExportFromServer_SuccessWithAllFields() { // 初始化静态模拟 mockStatic(DOAndDTOMapperUtils.class); try { // ... 测试代码 ... } finally { // 重置静态模拟 PowerMockito.reset(DOAndDTOMapperUtils.class); } } ``` ### 总结 1. 修复静态模拟清理问题:在每个使用静态模拟的测试方法中,使用`try-finally`块确保静态模拟被重置。 2. 修复空指针:在`ExportPersonService`的`getGroupName`方法中,确保获取的组列表不为null。 ### 修改后的ExportPersonService部分代码(修复空指针) ```java private void getGroupName(List<PersonDTO> personDTOList, List<String> personIdList, String vmsId) { // 获取组映射 Map<String, List<String>> groupMapping = personGroupMappingService.getGroupIdsMappingWithPersonIds(vmsId, personIdList); if (groupMapping == null) { groupMapping = Collections.emptyMap(); } // 收集所有组ID List<String> groupIdList = groupMapping.values().stream() .flatMap(Collection::stream) .distinct() .collect(Collectors.toList()); // 获取组列表 List<GroupDO> groups = groupRepository.getGroupListByIdList(vmsId, groupIdList); if (groups == null) { groups = Collections.emptyList(); // 防止空指针 } // 构建组ID到组对象的映射 Map<String, List<GroupDO>> groupIdToGroupList = groupIdList.stream() .collect(Collectors.toMap( Function.identity(), id -> groups.stream().filter(group -> group.getId().equals(id)).collect(Collectors.toList()) )); // 为每个人员设置组名 for (PersonDTO personDTO : personDTOList) { List<String> groupIds = groupMapping.get(personDTO.getId()); List<GroupDO> groupDOList = new ArrayList<>(); if (groupIds != null) { for (String groupId : groupIds) { List<GroupDO> groupDOs = groupIdToGroupList.get(groupId); if (groupDOs != null) { groupDOList.addAll(groupDOs); } } } personDTO.setGroupList(groupDOList.stream() .map(groupDO -> new GroupDTO().setId(groupDO.getId()).setName(groupDO.getName())) .collect(Collectors.toList())); } } ``` ### 注意事项 - 在测试方法中,每次模拟静态方法后,都要在`finally`块中重置,以避免影响其他测试方法。 - 确保在测试方法中不要重复模拟同一个静态类(除非已经重置),否则会抛出“静态模拟已注册”的异常。 ### 相关问题 §§相关问题§§: 1. 如何在PowerMock中正确管理静态方法的模拟和重置? 2. 使用PowerMock时,如何避免测试方法之间的相互影响? 3. 在Java中,如何安全地处理可能为空的集合以避免空指针异常? 4. 在单元测试中,如何测试包含静态方法调用的代码?</think>根据错误日志,我发现了两个核心问题:静态模拟清理失败和业务逻辑中的空指针异常。以下是完整的解决方案: ### 问题1:静态模拟清理失败 错误原因:PowerMock 2.x 中 `MockRepository.INSTANCE` 字段已被移除,导致反射失败。 #### 修复方案:使用官方推荐的静态模拟管理方式 ```java @After public void tearDown() { // 使用 PowerMock 官方推荐的方式清理静态模拟 PowerMockito.clearAllMocks(); // 添加 Mockito 的清理机制 Mockito.framework().clearInlineMocks(); } ``` ### 问题2:业务逻辑中的空指针异常 错误位置:`ExportPersonService.getGroupName()` 方法中的流操作 ```java // 原始问题代码 Map<String, List<GroupDO>> groupIdToGroupList = groupIdList.stream() .collect(Collectors.toMap( Function.identity(), id -> groups.stream() .filter(group -> group.getId().equals(id)) .collect(Collectors.toList()) )); ``` #### 修复方案:增强空值检查 ```java // 修复后的 getGroupName 方法 private void getGroupName(List<PersonDTO> personDTOList, List<String> personIdList, String vmsId) { // 1. 获取组映射关系 Map<String, List<String>> groupMapping = Optional.ofNullable( personGroupMappingService.getGroupIdsMappingWithPersonIds(vmsId, personIdList) ).orElse(Collections.emptyMap()); // 2. 收集所有组ID(增强空值检查) List<String> groupIdList = groupMapping.values().stream() .filter(Objects::nonNull) .flatMap(Collection::stream) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); // 3. 获取组详细信息(处理空值) List<GroupDO> groups = Optional.ofNullable( groupRepository.getGroupListByIdList(vmsId, groupIdList) ).orElse(Collections.emptyList()); // 4. 构建组ID到组对象的映射(修复空指针) Map<String, List<GroupDO>> groupIdToGroupList = groupIdList.stream() .filter(Objects::nonNull) .collect(Collectors.toMap( Function.identity(), id -> groups.stream() .filter(Objects::nonNull) .filter(group -> id.equals(group.getId())) .collect(Collectors.toList()) )); // 5. 为每个人员设置组信息(增强空值处理) for (PersonDTO personDTO : personDTOList) { List<String> groupIds = Optional.ofNullable( groupMapping.get(personDTO.getId()) ).orElse(Collections.emptyList()); List<GroupDO> groupDOList = new ArrayList<>(); for (String groupId : groupIds) { List<GroupDO> foundGroups = groupIdToGroupList.get(groupId); if (foundGroups != null) { groupDOList.addAll(foundGroups); } } // 转换为DTO personDTO.setGroupList(groupDOList.stream() .map(group -> new GroupDTO().setId(group.getId()).setName(group.getName())) .collect(Collectors.toList())); } } ``` ### 完整的修复后测试类 ```java package com.tplink.cdd.vms.person.core.domain.person; import com.tplink.cdd.vms.person.core.domain.util.DOAndDTOMapperUtils; // 其他导入保持不变... @RunWith(PowerMockRunner.class) @PrepareForTest({DOAndDTOMapperUtils.class, ExportPersonService.class}) public class ExportPersonServicePowerMockTest { @Mock private PersonRepository personRepository; @Mock private PersonGroupMappingService personGroupMappingService; @Mock private GroupRepository groupRepository; @Mock private AccessCardService accessCardService; @InjectMocks private ExportPersonService exportPersonService; private ExportPersonDTO exportPersonDTO; private QueryPersonDTO queryPersonDTO; @Before public void setUp() { exportPersonDTO = new ExportPersonDTO(); queryPersonDTO = new QueryPersonDTO(); queryPersonDTO.setVmsId("vms123"); exportPersonDTO.setQueryPerson(queryPersonDTO); } @After public void tearDown() { // 修复1:使用官方推荐的清理方式 PowerMockito.clearAllMocks(); Mockito.framework().clearInlineMocks(); } // 测试成功导出基础信息 @Test public void testExportFromServer_SuccessWithoutCard() { // 1. 准备测试数据 List<PersonDO> personDOList = Arrays.asList( createPersonDO("1", "John", "Doe", "E001"), createPersonDO("2", "Jane", "Smith", "E002") ); // 2. 设置Mock行为 when(personRepository.getPersonList(any(QueryPersonDTO.class))) .thenReturn(OperationResponse.ok(personDOList)); // 3. 设置组映射(修复空指针问题) Map<String, List<String>> groupMapping = new HashMap<>(); groupMapping.put("1", Collections.singletonList("g1")); groupMapping.put("2", Collections.singletonList("g2")); when(personGroupMappingService.getGroupIdsMappingWithPersonIds(anyString(), anyList())) .thenReturn(groupMapping); List<GroupDO> groups = Arrays.asList( new GroupDO().setId("g1").setName("Admin"), new GroupDO().setId("g2").setName("User") ); when(groupRepository.getGroupListByIdList(anyString(), anyList())) .thenReturn(groups); // 4. 执行测试 OperationResponse<List<PersonDTO>> response = exportPersonService.exportFromServer(exportPersonDTO); // 5. 验证结果 assertTrue(response.isOk()); List<PersonDTO> result = response.getResult(); assertEquals(2, result.size()); assertEquals("Admin", result.get(0).getGroupList().get(0).getName()); assertEquals("User", result.get(1).getGroupList().get(0).getName()); } // 测试包含所有字段的导出 @Test public void testExportFromServer_SuccessWithAllFields() { // 初始化静态模拟 mockStatic(DOAndDTOMapperUtils.class); try { // 1. 配置导出所有字段 exportPersonDTO.setCard(true); exportPersonDTO.setPin(true); exportPersonDTO.setEmail(true); exportPersonDTO.setPhone(true); // 2. 准备测试数据 PersonDO personDO = createPersonDO("1", "John", "Doe", "E001"); personDO.setPinCode("1234"); personDO.setEmail("john@example.com"); personDO.setPhone("1234567890"); List<PersonDO> personDOList = Collections.singletonList(personDO); // 3. 设置组信息Mock Map<String, List<String>> groupMapping = new HashMap<>(); groupMapping.put("1", Arrays.asList("g1", "g2")); List<GroupDO> groups = Arrays.asList( new GroupDO().setId("g1").setName("Group1"), new GroupDO().setId("g2").setName("Group2") ); when(personRepository.getPersonList(any(QueryPersonDTO.class))) .thenReturn(OperationResponse.ok(personDOList)); when(personGroupMappingService.getGroupIdsMappingWithPersonIds(anyString(), anyList())) .thenReturn(groupMapping); when(groupRepository.getGroupListByIdList(anyString(), anyList())) .thenReturn(groups); // 4. 设置卡片信息Mock List<AccessCardDO> cards = Arrays.asList( new AccessCardDO().setId("c1").setCardNumber("CARD-001"), new AccessCardDO().setId("c2").setCardNumber("CARD-002") ); when(accessCardService.findByPerson(anyString(), anyList())) .thenReturn(cards); // 5. 模拟静态转换方法 when(DOAndDTOMapperUtils.toAccessCardDTO(any(AccessCardDO.class))) .thenAnswer(invocation -> { AccessCardDO card = invocation.getArgument(0); return new AccessCardDTO().setCardNumber(card.getCardNumber()); }); // 6. 执行测试 OperationResponse<List<PersonDTO>> response = exportPersonService.exportFromServer(exportPersonDTO); // 7. 验证结果 assertTrue(response.isOk()); PersonDTO resultDTO = response.getResult().get(0); // 验证基础字段 assertEquals("John", resultDTO.getFirstName()); assertEquals("Doe", resultDTO.getLastName()); assertEquals("E001", resultDTO.getEmployeeId()); // 验证可选字段 assertEquals("1234", resultDTO.getPinCode()); assertEquals("john@example.com", resultDTO.getEmail()); assertEquals("1234567890", resultDTO.getPhone()); // 验证组信息 assertEquals(2, resultDTO.getGroupList().size()); assertEquals("Group1", resultDTO.getGroupList().get(0).getName()); assertEquals("Group2", resultDTO.getGroupList().get(1).getName()); // 验证卡片信息 assertEquals(2, resultDTO.getCardList().size()); assertEquals("CARD-001", resultDTO.getCardList().get(0).getCardNumber()); assertEquals("CARD-002", resultDTO.getCardList().get(1).getCardNumber()); // 验证静态方法调用 verifyStatic(DOAndDTOMapperUtils.class, times(2)); DOAndDTOMapperUtils.toAccessCardDTO(any(AccessCardDO.class)); } finally { // 清理静态模拟 PowerMockito.reset(DOAndDTOMapperUtils.class); } } // 辅助方法:创建PersonDO private PersonDO createPersonDO(String id, String firstName, String lastName, String employeeId) { PersonDO person = new PersonDO(); person.setId(id); person.setFirstName(firstName); person.setLastName(lastName); person.setEmployeeId(employeeId); person.setLongTermValid(true); person.setExpirationTime(new Date()); return person; } } ``` ### 关键修复点说明: 1. **静态模拟清理机制**: ```java @After public void tearDown() { PowerMockito.clearAllMocks(); // PowerMock官方清理方法 Mockito.framework().clearInlineMocks(); // Mockito增强清理 } ``` 2. **空指针防护三重机制**: - 使用 `Optional.ofNullable()` 处理可能为null的返回值 - 使用 `Objects::nonNull` 进行流过滤 - 使用 `Collections.emptyList()` 作为默认值 3. **静态模拟最佳实践**: ```java try { // 测试逻辑... } finally { PowerMockito.reset(DOAndDTOMapperUtils.class); } ``` 4. **业务逻辑增强**: ```java // 修复后的组映射处理 Map<String, List<String>> groupMapping = Optional.ofNullable( personGroupMappingService.getGroupIdsMappingWithPersonIds(vmsId, personIdList) ).orElse(Collections.emptyMap()); ``` ### PowerMock 版本兼容性解决方案 如果仍然遇到清理问题,请检查依赖版本: ```xml <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> ``` ### 备选方案:升级到现代测试框架 如果问题持续存在,考虑迁移到Mockito 4.x的内联MockMaker: ```java // 在测试类上添加 @ExtendWith(MockitoExtension.class) @TestInstance(Lifecycle.PER_CLASS) public class ExportPersonServiceModernTest { @Mock private PersonRepository personRepository; @InjectMocks private ExportPersonService exportPersonService; @Test void testExportSuccess() { try (MockedStatic<DOAndDTOMapperUtils> mocked = Mockito.mockStatic(DOAndDTOMapperUtils.class)) { // 设置静态方法模拟 mocked.when(() -> DOAndDTOMapperUtils.toAccessCardDTO(any())) .thenReturn(new AccessCardDTO()); // 测试逻辑... } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值