我面临测试类的问题,该类在构造函数中实现了与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。
我在考虑嘲笑,但我对此并不熟悉。
答案 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)