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

Java 如何使用到EJB的本地连接测试类,java,unit-testing,mocking,ejb,junit4,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.

我面临着测试类的问题,该类在构造函数中实现了一些到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();
}
最后是我要测试MyClass.processValue方法的junit类:

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集


我曾考虑过模拟,但我不熟悉这一点。

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

你可以找到更多关于它的信息


Martin Fowler还写了一篇关于何时使用mock以及mock和存根之间的区别的好文章。文章到此为止。

您可以使用JMockit mocking 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
的模拟甚至可以省略