7
votes

Comment se moquer de méthodes non statiques à l'aide de PowerMock

J'essaie de se moquer d'un appel de méthode interne de ma méthode de test

ma classe ressemble à ceci xxx

lorsque j'écris le junit pour la méthode getStudent () , Y a-t-il un moyen de se moquer de la ligne xxx

ou de rendre la classe d'application utilise un objet Mock Dao lors de l'exécution JUNIT au lieu de l'appel DAO qui se connecte à la DB ?


0 commentaires

3 Réponses :


1
votes

Afin de tirer beaucoup hors du cadre moqueur, l'objet MyDao doit être injecté. Vous pouvez utiliser quelque chose comme de printemps notre Guice ou utilisez simplement un motif d'usine pour vous fournir l'objet DAO. Ensuite, dans votre test de l'unité, vous avez une usine de test pour vous fournir des objets faux dao au lieu de vrais. Ensuite, vous pouvez écrire du code tel que:

Mockito.when(mockDao.getStudentDetails()).thenReturn(someValue);


1 commentaires

+1 pour suggérer une injection comme la bonne façon de manipuler cette



13
votes

Vous pouvez utiliser le quandNew () code> méthode de PowerMock (voir https://github.com/powermock/powermock/wiki/mockito#how-a-mock-construction-Of-New-Objects )

Cas de test complet p>

public class Student {
    private String name;
    public Student() {
        name = "real";
    }
    public String getName() {
        return name;
    }
}


2 commentaires

@Preparefortest (mydao .class) non app


@telebog incorrect. Du lien de ma réponse: Notez que vous devez préparer la classe Créer la nouvelle instance de MyClass pour le test, pas la myclass elle-même. Par exemple. Si la classe qui fait de la nouvelle myClass () est appelée x, vous devriez faire @preparesportest (X.class) pour que vous puissiez travailler:



-1
votes

Si vous n'avez pas accès à Mockito, vous pouvez également utiliser PowerMock pour faire le même objectif. Par exemple, vous pouvez effectuer ce qui suit:

@RunWith(PowerMockRunner.class)
@PrepareForTest(App.class)
public class AppTest {
    @Test
    public void testGetStudent() throws Exception {
        MyDAO mockDao = createMock(MyDAO.class);
        expect(mockDao.getStudentDetails()).andReturn(new Student());        
        replay(mockDao);        

        PowerMock.expectNew(MyDAO.class).andReturn(mockDao);
        PowerMock.replay(MyDAO.class);         
        // make sure to replay the class you expect to get called

        App app = new App();

        // do whatever tests you need here
    }
}


1 commentaires

Supprimera le Downvote si vous montrez où Createemock appelle à. Est-ce une importation statique? Si oui, pourquoi n'est-ce pas la même chose que PowerMock?