簡體   English   中英

如何在單元測試中模擬/存根Java容器?

[英]How to mock/stub Java container in unit testing?

我有一個實現ServletContextListener的對象,根據Java EE servlet規范,它在部署/啟動時由servlet容器通過其contextInitialized(ServletContext)方法調用。

我正在嘗試編寫一個單元測試,模擬一個servlet容器啟動並部署我的ServletContextListener (以便我可以確定應用程序是否正確初始化)。

這是可能的,如果是的話,怎么樣? 它是特定於容器的嗎? 如果是這樣我正在使用OGS。 尋找代碼看起來這樣

@Test
public void shouldBootstrapAppAtDeployTime() {
    // Given
    GlassFishContainer container = new GlassFishContainer(); // ha!
    MyApp app = mock(MyApp.class); // MyApp implements ServletContextListener

    // When - deploy app to container
    // Causes app.contextInitialized(ServletContext) to be called
    container.deploy(app);

    // Then - verify the method was called with any ServletContext
    mock.verify(app.contextInitialized(Matchers.any());
}

這是一個草率的偽代碼,其中有一些實施不當的Mockito用於演示目的(只是為了實現我的意圖)。 提前致謝!

也許你可以用Arquillian解決這個問題: http ://arquillian.org/features/

從網頁:

Arquillian將您的測試帶到運行時,使您可以訪問容器資源,有意義的反饋以及有關代碼實際工作方式的見解。

我認為你的方法有點誤。 你的單元測試偽代碼所做的是測試它正確調用你的ServletContextListener的容器邏輯 - 我會相信容器正確地做了。

我要做的是直接測試你的監聽器類,實例化它,使用模擬ServletContext調用contextInitialized()方法(我看到你熟悉Mockito,這是一個很好的工具!),如果你的ServletContextListener你做斷言按預期完成了它的工作。

不確定是否有這樣的測試框架 即使它存在,也不會在真實環境中進行測試 (可能與測試環境不同)。

編寫此類測試用例的最佳方法是:

  1. 使用ANT部署戰爭,您使用的服務器可能提供MBean或部署應用程序的東西
  2. 當調用contextInitialized()方法時,您的偵聽器可能正在執行某些功能。
  3. 編寫向服務器發出請求的客戶端,並檢查步驟2是否成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM