首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SpringMVC MockMvc 單元測試報錯:Can't find bundle for base name javax.servlet.LocalStrings, locale zh_CN 完美解決

     編輯:Java 相關知識

使用 SpringMVC 自帶 MockMvc 進行 Controller 單元測試時,控制台噴紅 Can't find bundle for base name javax.servlet.LocalStrings, locale zh_CN,雖不影響測試結果,但干擾日誌閱讀、掩蓋真實錯誤。本文記錄排查過程,給出 MyEclipse/IDEA 通用解決方案:補全 Servlet API 運行時依賴。

錯誤現場

Can't find bundle for base name javax.servlet.LocalStrings, locale zh_CN
java.util.MissingResourceException: Can't find bundle for base name javax.servlet.LocalStrings, locale zh_CN
    at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1564)
    at java.util.ResourceBundle.getBundle(ResourceBundle.java:1082)
    at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:123)
    ...
    at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:xxx)
  • 環境:JDK 1.8、Spring MVC 5.0、MyEclipse 2014、JUnit 4.12
  • 現象:測試能跑通,但控制台每次輸出此異常堆疊。

根因分析

javax.servlet.LocalStrings 是 Servlet API 內部用於國際化提示信息的資源包(包含中文等語言的錯誤消息)。MockMvc 模擬 Servlet 容器環境時,GenericServlet 初始化嘗試加載該資源包,但測試類路徑缺少 Servlet API 實現包(如 servlet-api.jar 或 javax.servlet-api.jar),導致 ResourceBundle 找不到 LocalStrings_zh_CN.properties。

解決方案:MyEclipse 圖形界面操作

  1. 右鍵項目 → Properties(屬性)
  2. 左側選 Java Build Path → Libraries 頁籤
  3. 點擊 Add Library... → 選擇 Server Runtime → Next
  4. 勾選項目使用的 Server Runtime(如 Apache Tomcat 9.0) → Finish
  5. Apply and Close
  6. 重新運行測試,異常消失,控制台乾淨。

Add Library Server Runtime Select Tomcat Runtime Apply Changes Test Pass Clean

通用方案:Maven 依賴(推薦)

現代項目建議在 pom.xml 顯式聲明 Servlet API 依賴(provided 作用域,避免與容器衝突):

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version> <!-- Spring 5 / Servlet 4.0 -->
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

執行 mvn test-compile 刷新類路徑,問題解決。

IDEA 用戶操作

  1. File → Project Structure → Modules → Dependencies
  2. + → Library → From Maven 搜索 javax.servlet:javax.servlet-api:4.0.1 添加,Scope 選 Provided。
  3. 或直接在 pom.xml 添加依賴,Maven Reload。

為什麼不影響測試結果?

  • MissingResourceException 被 Servlet 內部捕獲並忽略,僅打印堆疊,不拋出中斷流程。
  • 但污染測試輸出,干擾 CI 日誌分析、掩蓋真實斷言失敗信息,必須修復。

總結

MockMvc 需要 Servlet API 運行時類來模擬容器行為。核心修復:確保測試類路徑包含 javax.servlet-api (provided)。MyEclipse 用戶通過 Add Library → Server Runtime 快速解決;Maven 項目直接加依賴更規範、可移植。養成「測試編譯零警告、零異常堆疊」的潔癖,能省下無數排查時間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved