2008-10-06 4 views
1

J'utilise jmockit avec mes tests et avec une classe que je souhaite tester, utilise InitialContext directement. J'ai donc les suivantes:Comment se moquer de la classe InitialContext avec jmockit?

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

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

Dans mon cas de test, j'appelle utiliser mon « moqué » InitialContext classe:

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

Quelle est la meilleure façon de se moquer de la classe InitialContext avec jmockit.

J'ai déjà essayé quelques façons (par exemple en utilisant mon propre MockInitialContextFactory), mais en gardant trébuchant dans la même erreur:

NoClassDefFoundError: my.class.MockInitialContext 

D'après ce que je peux voir sur Google, se moquant avec JNDI est assez méchant . S'il vous plaît quelqu'un peut-il me fournir des conseils, ou me diriger vers une solution? Ce serait très apprécié. Je vous remercie.

Répondre

2

En général, pour se moquer de JNDI, vous devrez utiliser un framework, tel que EJBMock, qui peut fournir un conteneur fictif dans lequel déployer vos beans.

L'autre alternative est de refactoriser la création du contexte hors de votre code afin qu'il soit passé (c'est le refactoring d'injection de dépendance), et vous devriez être capable de substituer un mock à volonté.

0

Vous obtenez le NoClassDefFoundError car my.class.MockInitialContext n'existe pas. Vous devez créer cette classe si vous allez la passer en argument à Mockit.redefineMethods(). Votre classe MockInitialContext aurait juste besoin d'une méthode nommée lookup() qui accepte un paramètre String et retourne un javax.mail.Session.

J'aime JMockit annotations, mais vous pouvez regarder dans le reste de cette page pour d'autres exemples d'utilisation de JMockit.

3

Je maintenant il est une année depuis que quelqu'un a posté ici, mais depuis récemment, je me moquais des appels EJB en utilisant JMockit je me sentais la bonne chose à partager. (Même si je ne l'ai pas tester le code devrait être très similaire)

Vous pouvez définir un objet Raillé comme champ dans votre TestCase comme:

@Mocked InitialContext mockedInitialContext; 
@Mocked javax.mail.Session mockedSession; 

puis dans votre méthode de testXXX vous pouvez définir vos attentes(), après cela, il suffit d'appeler la méthode que vous voulez tester.

public void testSendindMail(){ 
    new Expectations(){ 
     { 
    mockedInitialContext.lookup("my.mail.session");returns(mockedSession);  
    } 
     }; 
    MyClass cl = new MyClass(); 
    cl.MyMethod();//This need JNDI Lookup 
} 
Questions connexes