J'ai un code un peu comme celui-ci ci-dessous:
Class A {
public boolean myMethod(someargs) {
MyQueryClass query = new MyQueryClass();
Long id = query.getNextId();
// some more code
}
}
Class MyQueryClass {
....
public Long getNextId() {
//lot of DB code, execute some DB query
return id;
}
}
Maintenant j'écris un test pour A.myMethod(someargs)
. Je veux ignorer la méthode réelle query.getNextId()
et renvoyer à la place une valeur de stub. En gros, je veux me moquer MyQueryClass
.
Donc, dans mon cas de test, j'ai utilisé:
MyQueryClass query = PowerMockito.mock(MyQueryClass.class);
PowerMockito.whenNew(MyQueryClass.class).withNoArguments().thenReturn(query);
when(query.getNextId()).thenReturn(1000000L);
boolean b = A.getInstance().myMethod(args);
//asserts
J'ai utilisé @RunWith(PowerMockRunner.class)
et @PrepareForTest({MyQueryClass.class})
au début de mon cours de test.
Mais quand je débogue le test, il appelle toujours la vraie méthode getNextId()
de la MyQueryClass
classe.
Qu'est-ce que j'oublie ici? Quelqu'un peut-il m'aider car je suis nouveau sur Mockito et PowerMockito.
Comme @TrueDub l'a mentionné dans sa réponse acceptée, vous devez ajouter la classe où le constructeur est appelé au
@PrepareForTest
.Cependant, si vous faites cela, la couverture pour cette classe telle que rapportée par eclemma et Sonar sera nulle pour cette classe
Wiki Powermockito
La solution ici serait donc de refactoriser le code réel pour utiliser une fabrique statique qui retournerait une instance de cette classe, puis la simulerait statiquement.
la source
Peut-être pouvez-vous simplement utiliser
la source