如何在java中模拟Session对象

时间:2014-12-17 17:23:06

标签: java junit mocking powermock jmockit

我创建了一个方法,我正在使用JaloSession。我正在为此写一个Junit测试。 请让我知道如何嘲笑以下内容。

ABC abc = JaloSession.getCurrentSession.getAttribute(“abc”);

提前致谢。

3 个答案:

答案 0 :(得分:2)

使用powermock,您可以模拟静态调用:

mockStatic(JaloSession.class);

expect(JaloSession.getCurrentSession()).andReturn(yourMock);

...etc

但是你不需要这样做。自控制代码以来最简单的事情可能就是在受保护的方法中包装此方法调用

protected ABC getAbc(){
     return JaloSession.getCurrentSession.getAttribute("abc");
}

然后在测试中,创建一个覆盖getAbc()的类的子类,以返回另一个ABC实例。

@Test
public void myTest(){
     final ABC mockAbc = ....

     Foo foo = new Foo(){
          @Override
          protected ABC getAbc(){
             return mockAbc;
          }
     };

     //do test on Foo
}

答案 1 :(得分:1)

由于静态调用,你不能(轻松)。

因此要么将当前会话传递给您正在测试的函数,要么定义用于获取当前会话的接口并将其传递给对象的构造函数。在生产中实现它来调用静态nmethod,并在测试中模拟它或构建假。

作为奖励,您将获得更清洁的设计,其中依赖性从上方传递而不是直接在最低级别访问。

答案 2 :(得分:1)

使用JMockit模拟库,您可以按如下方式模拟它:

@Test
public void mockJaloSession(@Mocked final JaloSession jalo) {
    final ABC testABC = new ABC();
    new Expectations() {{ jalo.getAttribute("abc"); result = testABC; }};

    // From code under test:
    ABC abc = JaloSession.getCurrentSession().getAttribute("abc");

    assertSame(testABC, abc);
}

(测试不需要担心getCurrentSession()调用,因为它会自动返回模拟jalo对象。)