[英]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.