如何在单元测试中处理会话变量

时间:2014-09-18 14:38:43

标签: java unit-testing session junit

我想知道如何在单元测试中处理会话变量。

例如,我有登录的变量用户,该会话由会话加载,但在运行测试时会话不存在。

如何在不更改测试类的代码的情况下处理这些情况? 我正在使用Junit。

谢谢大家, 让

2 个答案:

答案 0 :(得分:1)

  

如何在单元测试中处理会话变量

简答:你没有。单元测试单独运行,必须不与基础架构耦合。


进一步说明......

理想情况下,您应该尽量不使用会话。无状态应用程序更容易测试,维护,扩展等。当然,有时您必须跟踪某些状态测量。但是,不要将会话用作管理该状态的全能场所。您可以在不同的位置跟踪状态的不同元素,例如cookie或页面值或数据库。

如果您必须使用会话,请在界面后面抽象它。创建某种接口以提供状态管理并使用会话实现该接口。应用程序将使用该实现,单元测试将模拟该实现。这将应用程序的逻辑(您要测试它)与状态管理(您可以单独测试作为集成测试)分离。

这种界面的一个非常简单的例子可能是:

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

在实现的内部,您将在会话状态中存储值。您可能稍后使用另一个将值存储在数据库中的实现。重点是将其与其余代码分离,以便您可以随时更改状态管理技术(包括使用模拟进行测试)。

随着您的进一步发展,您可以使用更多定向方法替换这些简单的get / set值方法,例如存储(可能可序列化的)“状态对象”,其中包含有关该状态的一些业务逻辑,或者可能创建单独的方法存储特定种类的业务状态而不仅仅是原始值。天空是极限,真的。

一旦你解除了这个,你的应用程序中的任何对象都需要一个实现。也许是这样的:

public class SomeObject {
    private final StateValueManager state;

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

现在该对象可以获取/设置状态值(具体是会话状态,但SomeObject并不真正关心),只要调用该对象的代码为其提供状态管理器实现即可。你的单元测试会为它提供一个模拟代码。

答案 1 :(得分:1)

使用Mocking-Framework模拟会话。

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);
  } 
}