簡體   English   中英

如何在單元測試中處理會話變量

[英]How to handle session variables in unit tests

我想知道如何在單元測試中處理會話變量。

例如,我登錄了變量user,該變量由會話加載,但是在運行測試時該會話不存在。

我如何在不更改測試類代碼的情況下處理這些情況? 我正在使用Junit。

謝謝大家,讓

如何在單元測試中處理會話變量

簡短的回答:您沒有。 單元測試孤立地運行,並且不能連接到基礎設施。


進一步說明...

理想情況下,您應該嘗試完全不使用會話。 無狀態應用程序更易於測試,維護,擴展等。當然,有時您必須跟蹤某種狀態度量。 但是,請勿將會話用作管理該狀態的萬事通。 您可能在不同的位置跟蹤不同的狀態元素,例如cookie或頁面值或數據庫。

如果必須使用會話,請將其抽象到接口后面。 創建某種用於提供狀態管理的界面,並使用會話實現該界面。 應用程序將使用該實現,而單元測試將模擬該實現。 這將應用程序(您要測試)的邏輯與狀態管理(您可以將其作為集成測試分別測試)分離。

這種接口的一個非常簡單的示例可能是:

public interface StateValueManager {
    String getValue(String key);
    void setValue(String key, String value);
}

在實現內部,您將在會話狀態中存儲值。 您稍后可能會使用另一個將值存儲在數據庫中的實現。 關鍵是要使其與其余代碼脫鈎,以便您可以隨時更改狀態管理技術(包括使用模擬進行測試)。

隨着進一步的發展,您可以將這些簡單的獲取/設置值方法替換為更具針對性的方法,例如,存儲一個(可能可序列化的)“狀態對象”,其中包含有關該狀態的一些業務邏輯,或者可能創建用於存儲特定種類的單獨方法業務狀態,而不僅僅是原始價值。 真的,天空是極限。

解耦之后,應用程序中的任何對象都將需要實現。 也許是這樣的:

public class SomeObject {
    private final StateValueManager state;

    public SomeObject(StateValueManager state) {
        this.state = state;
    }
}

現在,只要調用該對象的代碼為該對象提供狀態管理器實現,該對象就可以在狀態(特別是會話狀態,但SomeObject並不關心)中獲取/設置值。 您的單元測試將為其提供模擬。

使用模擬框架來模擬會話。

Mockito: http : //code.google.com/p/mockito/

public class TestClass {

  @Mock
  private HttpSession session;

  @Before
  public void setUp() {
    MockitoAnnotations.initMocks(this);
  }

  @Test    
  public void testMethod() {
    Mockito.doReturn("ok").when(session).getAttribute("abc");
    ...
    classToTest.doIt(session);
  } 
}

暫無
暫無

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

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