Java 如何使用到EJB的本地连接测试类
我面临着测试类的问题,该类在构造函数中实现了一些到EJB的本地连接。此连接仅在构造函数内部使用,并设置实例化类的一些私有属性 我要测试的MyClass: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.
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
的模拟甚至可以省略