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

SpringMVC MockMvc 測試中文亂碼問題解決:LocalStrings 找不到

     編輯:Java 綜合教學

問題現象

使用 SpringMVC 5.0 + JUnit 4.12 + MyEclipse 進行 MockMvc 單元測試時,控制台噴出:

Can't find bundle for base name javax.servlet.LocalStrings, locale zh_CN

雖不影響測試執行,但干擾日誌閱讀,且提示缺少 Servlet 運行環境資源。

根因分析

MockMvc 在獨立測試環境下模擬 Servlet 容器,但 classpath 缺少 javax.servlet.jsp.jstl 或 tomcat-embed-jasper 等提供 LocalStrings.properties 的 JAR。中文環境下嘗試載入 zh_CN 語言包失敗。

MyEclipse 圖形化解決方案

  1. 右鍵專案 → Properties
  2. 左側選 MyEclipse → Web Capabilities
  3. 勾選 Enable Web Project Capabilities
  4. 在 Servlet Library 下拉選單選擇 Apache Tomcat 8.5/9.0(或與目標運行環境一致)
  5. 點擊 Apply and Close
  6. 重新運行測試,錯誤消失

Maven 專案依賴解決方案

在 pom.xml test scope 添加:

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <version>9.0.70</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jstl-impl</artifactId>
    <version>1.2</version>
    <scope>test</scope>
</dependency>

IntelliJ IDEA 解決方案

  1. File → Project Structure → Modules → Dependencies
  2. 點擊 + → JARs or directories 選擇 Tomcat lib 目錄下的 jsp-api.jar、jasper.jar
  3. 或直接在 Run/Debug Configurations 的 Use classpath of module 選擇 Web 模塊

原理解析

  • LocalStrings.properties 位於 jasper.jar 或 tomcat-embed-jasper.jar 的 javax/servlet/ 目錄
  • Spring 測試框架啟動時初始化 DispatcherServlet,JSP 引擎嘗試載入語言包
  • 補齊 JAR 後,ResourceBundle.getBundle("javax.servlet.LocalStrings") 能正確找到 zh_CN 變體

驗證測試

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration("classpath:spring-mvc-test.xml")
public class ControllerTest {
    @Autowired WebApplicationContext wac;
    MockMvc mockMvc;

    @Before public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }

    @Test public void testHome() throws Exception {
        mockMvc.perform(get("/"))
               .andExpect(status().isOk())
               .andExpect(view().name("index"));
    }
}

補全 Servlet 運行時依賴,MockMvc 測試環境即可完美支援中文語系。

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