繁体   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