如何使用与EJB的本地连接测试类

时间:2013-05-21 06:39:32

标签: java unit-testing mocking ejb junit4

我面临测试类的问题,该类在构造函数中实现了与EJB的一些本地连接。此连接仅在构造函数内部使用,并设置实例化类的一些私有属性。

我要测试的MyClass:

public class MyClass {

  private String myValue;

  public MyClass() throws Exception {
    MyBeanLocal local = EJBFactory.getLocal(MyBeanLocal.class);
    myValue = local.fetchValue();
  }

  public void processValue() {
    ... do some String magic which should be tested ...
  }

  public String getValue() {
    return myValue;
  }

}

EJBFactory包含一些增强的查找(使用缓存),可以返回本地或远程连接(远程需要服务器位置)。

MyBeanLocal接口

public interface MyLocalBean {
  public String fetchValue();
}

最后我的junit类我要测试MyClass.processValue方法:

public class MyClassTest {

  private MyClass myClass;

  @Before
  public void setUp() {
    myClass = new MyClass();
  }

  @Test
  public void testProcessValue() {
    Assert.assertEquals(myClass.processValue(), "MY EXPECTED VALUE");
  }

}

问题是当我在本地机器(或者像Hudson或Jenkins这样的自动测试机器)上运行JUnits并且在应用程序服务器上下文中运行bean时,如何测试情况,这与我的本地机器不同。我无法触及生产代码,只需要编写测试。

实际上我不需要使MyBeanLocal有效,但我需要设置myValue。

我在考虑嘲笑,但我对此并不熟悉。

2 个答案:

答案 0 :(得分:1)

您可以使用JMockit模拟API(我创建的)进行此类测试:

public class MyClassTest
{
    @Tested MyClass myClass;

    @Test
    public void processValue() {
        new NonStrictExpectations() {
            @Mocked EJBFactory fac;
            @Mocked MyBeanLocal mb;

            {
                EJBFactory.getLocal(MyBeanLocal.class); result = mb;
                mb.fetchValue(); result = "SOME VALUE";
            }
        };

        assertEquals(myClass.processValue(), "MY EXPECTED VALUE");
    }
}

EJBFactory的模拟甚至可以省略,如果它仍然在单元测试环境中返回一个对象。

答案 1 :(得分:0)

当测试涉及数据库连接的类时,模拟通常是最好的方法。 有几个框架可以使模拟对象更容易,其中一个是 Mockito

您可以找到有关它的更多信息here

Martin Fowler还写了一篇关于何时使用模拟的好文章,以及模拟和存根之间的区别。这是文章的a link