如何使用jmockit模拟InitialContext类?

时间:2008-10-06 15:53:55

标签: java jndi mocking jmockit

我正在使用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嘲笑是非常讨厌的。请任何人可以向我提供一些指导,或指出我的解决方案?非常感谢。谢谢。

3 个答案:

答案 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的其他示例。