我正在使用jmockit和我的测试,我希望测试一个类,直接使用InitialContext
。所以我有以下内容:
public class MyClass {
public void myMethod() {
InitialContext ic = new InitialContext();
javax.mail.Session mailSession = ic.lookup("my.mail.session");
// rest of method follows.....
}
在我的测试用例中,我将其称为使用我的“模拟”InitialContext
类:
Mockit.redefineMethods(InitialContext.class, MockInitialContext.class);
使用jmockit模拟InitialContext
类的最佳方法是什么。
我已经尝试了一些方法(例如使用我自己的MockInitialContextFactory
),但仍然遇到同样的错误:
NoClassDefFoundError: my.class.MockInitialContext
从我在谷歌上看到的,用JNDI嘲笑是非常讨厌的。请任何人可以向我提供一些指导,或指出我的解决方案?非常感谢。谢谢。
答案 0 :(得分:4)
我现在已经有一年了,因为有人在这里发帖,但是从最近我用JMockit嘲笑EJB调用,我觉得分享是正确的。 (即使我没有测试它,代码应该非常相似)
您可以在TestCase中将一些Mocked对象定义为字段,如:
@Mocked InitialContext mockedInitialContext;
@Mocked javax.mail.Session mockedSession;
然后在你的testXXX方法中你可以定义你的Expectations(),这样做只需要调用你想要测试的方法。
public void testSendindMail(){
new Expectations(){
{
mockedInitialContext.lookup("my.mail.session");returns(mockedSession);
}
};
MyClass cl = new MyClass ();
cl.MyMethod();//This need JNDI Lookup
}
答案 1 :(得分:3)
通常,要模拟JNDI,您需要使用一个框架,例如EJBMock,它可以提供一个模拟容器来部署bean。
另一个选择是重构从代码中创建上下文以便传入它(这是依赖注入重构),然后你应该能够随意替换模拟。
答案 2 :(得分:1)
您正在获取NoClassDefFoundError,因为my.class.MockInitialContext不存在。如果要将它作为参数传递给Mockit.redefineMethods(),则需要创建该类。你的MockInitialContext类只需要一个名为lookup()的方法,它接受一个String参数并返回一个javax.mail.Session。
我喜欢JMockit annotations,但您可以浏览该页面的其余部分,了解有关如何使用JMockit的其他示例。