2

I'm using jmockit with my tests and with one class I wish to test, uses InitialContext directly. So I have the following:

public class MyClass {
  public void myMethod() {
    InitialContext ic = new InitialContext();
    javax.mail.Session mailSession = ic.lookup("my.mail.session");

    // rest of method follows.....
  }

In my test case, I call this to use my "mocked" InitialContext class:

Mockit.redefineMethods(InitialContext.class, MockInitialContext.class);

What is the best way to mock the InitialContext class with jmockit.

I've already tried a few ways (such as using my own MockInitialContextFactory), but keeping stumbling into the same error:

NoClassDefFoundError: my.class.MockInitialContext

From what I can see on Google, mocking with JNDI is quite nasty. Please can anyone provide me with some guidance, or point me to a solution? That would be much appreciated. Thank you.

4

3 回答 3

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
}
于 2009-10-27T22:47:06.810 回答
3

通常,要模拟 JNDI,您需要使用一个框架,例如 EJBMock,它可以提供一个模拟容器来部署您的 bean。

另一种选择是重构从代码中创建上下文以便传入(这是依赖注入重构),然后您应该能够随意替换模拟。

于 2008-10-06T17:02:51.710 回答
1

您收到 NoClassDefFoundError 因为 my.class.MockInitialContext 不存在。如果要将其作为参数传递给 Mockit.redefineMethods(),则需要创建该类。您的 MockInitialContext 类只需要一个名为 lookup() 的方法,该方法接受一个字符串参数并返回一个 javax.mail.Session。

我喜欢JMockit 注释,但您可以查看该页面的其余部分以了解如何使用 JMockit 的其他示例。

于 2008-10-17T20:04:47.377 回答