2026-03-18 15:18:30 +08:00
<?xml version="1.0" encoding="UTF-8"?>
2026-03-23 13:05:44 +08:00
<testsuite xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report-3.0.xsd" version= "3.0" name= "com.example.demo.controller.UserControllerTest" time= "0.582" tests= "6" errors= "0" skipped= "0" failures= "0" >
2026-03-18 15:18:30 +08:00
<properties >
2026-03-23 13:05:44 +08:00
<property name= "java.specification.version" value= "17" />
<property name= "sun.cpu.isalist" value= "amd64" />
<property name= "sun.jnu.encoding" value= "GBK" />
<property name= "java.class.path" value= "D:\qoderhome\gitcode\springboot-demo-clean\target\test-classes;D:\qoderhome\gitcode\springboot-demo-clean\target\classes;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-web\3.2.0\spring-boot-starter-web-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter\3.2.0\spring-boot-starter-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot\3.2.0\spring-boot-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\3.2.0\spring-boot-autoconfigure-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\3.2.0\spring-boot-starter-logging-3.2.0.jar;C:\Users\lin\.m2\repository\ch\qos\logback\logback-classic\1.4.11\logback-classic-1.4.11.jar;C:\Users\lin\.m2\repository\ch\qos\logback\logback-core\1.4.11\logback-core-1.4.11.jar;C:\Users\lin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.21.1\log4j-to-slf4j-2.21.1.jar;C:\Users\lin\.m2\repository\org\apache\logging\log4j\log4j-api\2.21.1\log4j-api-2.21.1.jar;C:\Users\lin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.9\jul-to-slf4j-2.0.9.jar;C:\Users\lin\.m2\repository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;C:\Users\lin\.m2\repository\org\yaml\snakeyaml\2.2\snakeyaml-2.2.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-json\3.2.0\spring-boot-starter-json-3.2.0.jar;C:\Users\lin\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.15.3\jackson-datatype-jdk8-2.15.3.jar;C:\Users\lin\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.15.3\jackson-datatype-jsr310-2.15.3.jar;C:\Users\lin\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.15.3\jackson-module-parameter-names-2.15.3.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\3.2.0\spring-boot-starter-tomcat-3.2.0.jar;C:\Users\lin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\10.1.16\tomcat-embed-core-10.1.16.jar;C:\Users\lin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.16\tomcat-embed-websocket-10.1.16.jar;C:\Users\lin\.m2\repository\org\springframework\spring-web\6.1.1\spring-web-6.1.1.jar;C:\Users\lin\.m2\repository\org\springframework\spring-beans\6.1.1\spring-beans-6.1.1.jar;C:\Users\lin\.m2\repository\org\springframework\spring-webmvc\6.1.1\spring-webmvc-6.1.1.jar;C:\Users\lin\.m2\repository\org\springframework\spring-context\6.1.1\spring-context-6.1.1.jar;C:\Users\lin\.m2\repository\org\springframework\spring-expression\6.1.1\spring-expression-6.1.1.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-aop\3.2.0\spring-boot-starter-aop-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\spring-aop\6.1.1\spring-aop-6.1.1.jar;C:\Users\lin\.m2\repository\org\aspectj\aspectjweaver\1.9.20.1\aspectjweaver-1.9.20.1.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-actuator\3.2.0\spring-boot-starter-actuator-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\3.2.0\spring-boot-actuator-autoconfigure-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-actuator\3.2.0\spring-boot-actuator-3.2.0.jar;C:\Users\lin\.m2\repository\io\micrometer\micrometer-observation\1.12.0\micrometer-observation-1.12.0.jar;C:\Users\lin\.m2\repository\io\micrometer\micrometer-commons\1.12.0\micrometer-commons-1.12.0.jar;C:\Users\lin\.m2\repository\io\micrometer\micrometer-jakarta9\1.12.0\micrometer-jakarta9-1.12.0.jar;C:\Users\lin\.m2\repository\io\micrometer\micrometer-core\1.12.0\micrometer-core-1.12.0.jar;C:\Users\lin\.m2\repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;C:\Users\lin\.m2\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-validation\3.2.0\spring-boot-starter-validation-3.2.0.jar;C:\Users\lin\.m2\repository\org\apache\tomcat\emb
<property name= "java.vm.vendor" value= "Microsoft" />
2026-03-18 15:18:30 +08:00
<property name= "sun.arch.data.model" value= "64" />
2026-03-23 13:05:44 +08:00
<property name= "user.variant" value= "" />
<property name= "java.vendor.url" value= "https://www.microsoft.com" />
2026-03-18 15:18:30 +08:00
<property name= "user.timezone" value= "Asia/Shanghai" />
<property name= "org.jboss.logging.provider" value= "slf4j" />
2026-03-23 13:05:44 +08:00
<property name= "os.name" value= "Windows 11" />
<property name= "java.vm.specification.version" value= "17" />
2026-03-18 15:18:30 +08:00
<property name= "sun.java.launcher" value= "SUN_STANDARD" />
2026-03-23 13:05:44 +08:00
<property name= "user.country" value= "CN" />
<property name= "sun.boot.library.path" value= "D:\qoderhome\tools\jdk-17.0.18+8\bin" />
<property name= "sun.java.command" value= "C:\Users\lin\AppData\Local\Temp\surefire2739764732858287998\surefirebooter-20260323130249927_3.jar C:\Users\lin\AppData\Local\Temp\surefire2739764732858287998 2026-03-23T13-02-49_423-jvmRun1 surefire-20260323130249927_1tmp surefire_0-20260323130249927_2tmp" />
2026-03-18 15:18:30 +08:00
<property name= "jdk.debug" value= "release" />
2026-03-23 13:05:44 +08:00
<property name= "surefire.test.class.path" value= "D:\qoderhome\gitcode\springboot-demo-clean\target\test-classes;D:\qoderhome\gitcode\springboot-demo-clean\target\classes;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-web\3.2.0\spring-boot-starter-web-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter\3.2.0\spring-boot-starter-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot\3.2.0\spring-boot-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\3.2.0\spring-boot-autoconfigure-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\3.2.0\spring-boot-starter-logging-3.2.0.jar;C:\Users\lin\.m2\repository\ch\qos\logback\logback-classic\1.4.11\logback-classic-1.4.11.jar;C:\Users\lin\.m2\repository\ch\qos\logback\logback-core\1.4.11\logback-core-1.4.11.jar;C:\Users\lin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.21.1\log4j-to-slf4j-2.21.1.jar;C:\Users\lin\.m2\repository\org\apache\logging\log4j\log4j-api\2.21.1\log4j-api-2.21.1.jar;C:\Users\lin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.9\jul-to-slf4j-2.0.9.jar;C:\Users\lin\.m2\repository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;C:\Users\lin\.m2\repository\org\yaml\snakeyaml\2.2\snakeyaml-2.2.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-json\3.2.0\spring-boot-starter-json-3.2.0.jar;C:\Users\lin\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.15.3\jackson-datatype-jdk8-2.15.3.jar;C:\Users\lin\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.15.3\jackson-datatype-jsr310-2.15.3.jar;C:\Users\lin\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.15.3\jackson-module-parameter-names-2.15.3.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\3.2.0\spring-boot-starter-tomcat-3.2.0.jar;C:\Users\lin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\10.1.16\tomcat-embed-core-10.1.16.jar;C:\Users\lin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.16\tomcat-embed-websocket-10.1.16.jar;C:\Users\lin\.m2\repository\org\springframework\spring-web\6.1.1\spring-web-6.1.1.jar;C:\Users\lin\.m2\repository\org\springframework\spring-beans\6.1.1\spring-beans-6.1.1.jar;C:\Users\lin\.m2\repository\org\springframework\spring-webmvc\6.1.1\spring-webmvc-6.1.1.jar;C:\Users\lin\.m2\repository\org\springframework\spring-context\6.1.1\spring-context-6.1.1.jar;C:\Users\lin\.m2\repository\org\springframework\spring-expression\6.1.1\spring-expression-6.1.1.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-aop\3.2.0\spring-boot-starter-aop-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\spring-aop\6.1.1\spring-aop-6.1.1.jar;C:\Users\lin\.m2\repository\org\aspectj\aspectjweaver\1.9.20.1\aspectjweaver-1.9.20.1.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-actuator\3.2.0\spring-boot-starter-actuator-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\3.2.0\spring-boot-actuator-autoconfigure-3.2.0.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-actuator\3.2.0\spring-boot-actuator-3.2.0.jar;C:\Users\lin\.m2\repository\io\micrometer\micrometer-observation\1.12.0\micrometer-observation-1.12.0.jar;C:\Users\lin\.m2\repository\io\micrometer\micrometer-commons\1.12.0\micrometer-commons-1.12.0.jar;C:\Users\lin\.m2\repository\io\micrometer\micrometer-jakarta9\1.12.0\micrometer-jakarta9-1.12.0.jar;C:\Users\lin\.m2\repository\io\micrometer\micrometer-core\1.12.0\micrometer-core-1.12.0.jar;C:\Users\lin\.m2\repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;C:\Users\lin\.m2\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;C:\Users\lin\.m2\repository\org\springframework\boot\spring-boot-starter-validation\3.2.0\spring-boot-starter-validation-3.2.0.jar;C:\Users\lin\.m2\repository\org\apache\t
2026-03-18 15:18:30 +08:00
<property name= "sun.cpu.endian" value= "little" />
2026-03-23 13:05:44 +08:00
<property name= "user.home" value= "C:\Users\lin" />
<property name= "user.language" value= "zh" />
2026-03-18 15:18:30 +08:00
<property name= "java.specification.vendor" value= "Oracle Corporation" />
<property name= "java.version.date" value= "2026-01-20" />
2026-03-23 13:05:44 +08:00
<property name= "java.home" value= "D:\qoderhome\tools\jdk-17.0.18+8" />
<property name= "file.separator" value= "\" />
<property name= "basedir" value= "D:\qoderhome\gitcode\springboot-demo-clean" />
<property name= "java.vm.compressedOopsMode" value= "Zero based" />
2026-03-18 15:18:30 +08:00
<property name= "line.separator" value= " " />
<property name= "java.vm.specification.vendor" value= "Oracle Corporation" />
<property name= "java.specification.name" value= "Java Platform API Specification" />
2026-03-23 13:05:44 +08:00
<property name= "FILE_LOG_CHARSET" value= "GBK" />
2026-03-18 15:18:30 +08:00
<property name= "java.awt.headless" value= "true" />
2026-03-23 13:05:44 +08:00
<property name= "surefire.real.class.path" value= "C:\Users\lin\AppData\Local\Temp\surefire2739764732858287998\surefirebooter-20260323130249927_3.jar" />
<property name= "user.script" value= "" />
2026-03-18 15:18:30 +08:00
<property name= "sun.management.compiler" value= "HotSpot 64-Bit Tiered Compilers" />
2026-03-23 13:05:44 +08:00
<property name= "java.runtime.version" value= "17.0.18+8-LTS" />
<property name= "user.name" value= "lin" />
<property name= "path.separator" value= ";" />
<property name= "os.version" value= "10.0" />
2026-03-18 15:18:30 +08:00
<property name= "java.runtime.name" value= "OpenJDK Runtime Environment" />
2026-03-23 13:05:44 +08:00
<property name= "file.encoding" value= "GBK" />
2026-03-18 15:18:30 +08:00
<property name= "java.vm.name" value= "OpenJDK 64-Bit Server VM" />
2026-03-23 13:05:44 +08:00
<property name= "java.vendor.version" value= "Microsoft-13106358" />
<property name= "localRepository" value= "C:\Users\lin\.m2\repository" />
<property name= "java.vendor.url.bug" value= "https://github.com/microsoft/openjdk/issues" />
<property name= "java.io.tmpdir" value= "C:\Users\lin\AppData\Local\Temp\" />
<property name= "java.version" value= "17.0.18" />
<property name= "user.dir" value= "D:\qoderhome\gitcode\springboot-demo-clean" />
<property name= "os.arch" value= "amd64" />
2026-03-18 15:18:30 +08:00
<property name= "java.vm.specification.name" value= "Java Virtual Machine Specification" />
2026-03-23 13:05:44 +08:00
<property name= "PID" value= "29840" />
<property name= "sun.os.patch.level" value= "" />
<property name= "CONSOLE_LOG_CHARSET" value= "GBK" />
<property name= "native.encoding" value= "GBK" />
<property name= "java.library.path" value= "D:\qoderhome\tools\jdk-17.0.18+8\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Users\lin\.codex\tmp\arg0\codex-arg01qp2cp;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Bandizip\;C:\Program Files\Git\cmd;C:\Program Files\nodejs\;D:\qoderhome\tools\apache-maven-3.9.14\bin;D:\qoderhome\tools\jdk-17.0.18+8\bin;C:\Users\lin\AppData\Local\Microsoft\WindowsApps;C:\Users\lin\AppData\Roaming\npm;C:\Users\lin\AppData\Local\OpenAI\Codex\bin;C:\Program Files\WindowsApps\OpenAI.Codex_26.313.5234.0_x64__2p2nqsd0c76g0\app\resources;." />
2026-03-18 15:18:30 +08:00
<property name= "java.vm.info" value= "mixed mode, sharing" />
2026-03-23 13:05:44 +08:00
<property name= "java.vendor" value= "Microsoft" />
<property name= "java.vm.version" value= "17.0.18+8-LTS" />
<property name= "java.specification.maintenance.version" value= "1" />
2026-03-18 15:18:30 +08:00
<property name= "sun.io.unicode.encoding" value= "UnicodeLittle" />
2026-03-23 13:05:44 +08:00
<property name= "java.class.version" value= "61.0" />
2026-03-18 15:18:30 +08:00
<property name= "LOGGED_APPLICATION_NAME" value= "[springboot-demo] " />
</properties>
2026-03-23 13:05:44 +08:00
<testcase name= "shouldExposeUserStats" classname= "com.example.demo.controller.UserControllerTest" time= "0.152" >
<system-out > < ![CDATA[2026-03-23T13:03:07.689+08:00 INFO 29840 --- [springboot-demo] [ main] t.c.s.AnnotationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.example.demo.controller.UserControllerTest]: UserControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
2026-03-23T13:03:07.705+08:00 INFO 29840 --- [springboot-demo] [ main] .b.t.c.SpringBootTestContextBootstrapper : Found @SpringBootConfiguration com.example.demo.DemoApplication for test class com.example.demo.controller.UserControllerTest
[AOP-Before] Controller 方法开始: getUserStats
参数: []
[AOP-Performance] UserService.getStats() completed in 58ms
[AOP-After] Service 方法结束: getStats
[AOP-Performance] UserController.getUserStats() completed in 58ms
[AOP-AfterReturning] 方法返回: getUserStats
返回值: ApiResponse[code=0, message=success, data=UserStatsResponse[totalUsers=3, adults=3, underThirty=2, averageAge=27.666666666666668], timestamp=2026-03-23T05:03:07.806292200Z]
]]></system-out>
</testcase>
<testcase name= "shouldRejectDuplicateEmail" classname= "com.example.demo.controller.UserControllerTest" time= "0.229" >
<system-out > < ![CDATA[[AOP-Before] Controller 方法开始: createUser
参数: [UserRequest[name=Another User, email=alice@example.com, age=29]]
[AOP-Performance] UserService.create(..) failed after 2ms
[AOP-AfterThrowing] 方法异常: create
异常: A user with email alice@example.com already exists.
[AOP-After] Service 方法结束: create
[AOP-Performance] UserController.createUser(..) failed after 2ms
[AOP-AfterThrowing] 方法异常: createUser
异常: A user with email alice@example.com already exists.
2026-03-18 15:18:30 +08:00
]]></system-out>
</testcase>
2026-03-23 13:05:44 +08:00
<testcase name= "shouldRejectUserEndpointsWithoutToken" classname= "com.example.demo.controller.UserControllerTest" time= "0.01" />
<testcase name= "shouldRejectInvalidUser" classname= "com.example.demo.controller.UserControllerTest" time= "0.075" />
<testcase name= "shouldCreateUser" classname= "com.example.demo.controller.UserControllerTest" time= "0.021" >
2026-03-18 15:18:30 +08:00
<system-out > < ![CDATA[[AOP-Before] Controller 方法开始: createUser
2026-03-23 13:05:44 +08:00
参数: [UserRequest[name=Demo User, email=demo-user@example.com, age=22]]
[AOP-Performance] UserService.create(..) completed in 0ms
2026-03-18 15:18:30 +08:00
[AOP-After] Service 方法结束: create
2026-03-23 13:05:44 +08:00
[AOP-Performance] UserController.createUser(..) completed in 0ms
2026-03-18 15:18:30 +08:00
[AOP-AfterReturning] 方法返回: createUser
2026-03-23 13:05:44 +08:00
返回值: ApiResponse[code=0, message=User created successfully, data=com.example.demo.model.User@256c6f7a, timestamp=2026-03-23T05:03:08.202135900Z]
2026-03-18 15:18:30 +08:00
]]></system-out>
</testcase>
2026-03-23 13:05:44 +08:00
<testcase name= "shouldListUsersWithApiResponseWrapper" classname= "com.example.demo.controller.UserControllerTest" time= "0.056" >
2026-03-18 15:18:30 +08:00
<system-out > < ![CDATA[[AOP-Before] Controller 方法开始: getAllUsers
参数: []
2026-03-23 13:05:44 +08:00
[AOP-Performance] UserService.findAll() completed in 2ms
2026-03-18 15:18:30 +08:00
[AOP-After] Service 方法结束: findAll
2026-03-23 13:05:44 +08:00
[AOP-Performance] UserController.getAllUsers() completed in 2ms
2026-03-18 15:18:30 +08:00
[AOP-AfterReturning] 方法返回: getAllUsers
2026-03-23 13:05:44 +08:00
返回值: ApiResponse[code=0, message=success, data=[com.example.demo.model.User@79d3c655, com.example.demo.model.User@42ea14b8, com.example.demo.model.User@5837cb9e, com.example.demo.model.User@256c6f7a], timestamp=2026-03-23T05:03:08.247801Z]
2026-03-18 15:18:30 +08:00
]]></system-out>
</testcase>
</testsuite>