Как издеваться над классом InitialContext с помощью jmockit? - PullRequest
2 голосов
/ 06 октября 2008

Я использую 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);

Как лучше всего высмеивать класс InitialContext с помощью jmockit.

Я уже пробовал несколько способов (например, используя свой MockInitialContextFactory), но продолжаю сталкиваться с той же ошибкой:

NoClassDefFoundError: my.class.MockInitialContext

Из того, что я вижу в Google, насмешка над JNDI довольно неприятна. Пожалуйста, кто-нибудь может дать мне какое-нибудь руководство или указать мне решение? Это будет высоко ценится. Спасибо.

Ответы [ 3 ]

4 голосов
/ 28 октября 2009

Мне уже год, как кто-то написал здесь, но с недавнего времени я издевался над EJB-вызовами, используя JMockit, и я чувствовал, что это правильная вещь. (Хотя я не проверял его, код должен быть очень похожим)

Вы можете определить какой-нибудь Mocked объект как поле в вашем TestCase, например:

@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
}
3 голосов
/ 06 октября 2008

В общем, для макета JNDI вам понадобится каркас, такой как EJBMock, который может предоставить фиктивный контейнер для развертывания ваших бинов.

Другой альтернативой является рефакторинг, создающий контекст из вашего кода для его передачи (это рефакторинг внедрения зависимостей), и тогда вы сможете заменить макет по желанию.

1 голос
/ 18 октября 2008

Вы получаете NoClassDefFoundError, потому что my.class.MockInitialContext не существует. Вам нужно создать этот класс, если вы собираетесь передать его в качестве аргумента Mockit.redefineMethods (). Вашему классу MockInitialContext просто потребуется метод с именем lookup (), который принимает параметр String и возвращает javax.mail.Session.

Мне нравятся аннотации JMockit , но вы можете просмотреть остальную часть этой страницы, чтобы найти другие примеры использования JMockit.

...