Je classe simple mais avec bloc anonyme de code. Je dois couvrir cette classe avec des tests
@RunWith(MockitoJUnitRunner.class) public class CleanerTaskTest { final static int CLEANER_DELAY = 5; @Mock DataWarehouseMessageDao dao; @Mock TransactionTemplate template; CleanerTask cleanerTask; @Before public void setUp() throws Exception { cleanerTask = new CleanerTask(dao, CLEANER_DELAY, template); } @Test public void successfulScenario() { try { cleanerTask.clean(); verify(template, times(1)).execute(isA(TransactionCallback.class)); //that verify was not triggered //verify(dao, times(1)).deleteAllByStatusAndDate(anyInt(), isA(Date.class)); } catch (Exception e) { e.printStackTrace(); fail("No exceptions must occur"); } } }
3 Réponses :
Eh bien, votre problème ici est que Dans des cas comme celui-ci, je serais mais si vous vraiment strong> voulez tester ce morceau de code anonyme, je l'extraire tout simplement (toute la classe anonyme) à une classe distincte et écrivez un test d'unité juste pour cette nouvelle classe et plus Précisément pour c'est transactiontemplate code> dans votre test est une simule. En tant que tel, il a la même interface que
transactiontemplate code> mais ne sait pas comment se comporter. Vous êtes responsable de sa mise en œuvre - c'est tout le point de moqueur. Vous appelez explicitement
template.execute () code> dans votre code et c'est pourquoi votre première vérification passe. Mais que
exécuter () code> n'est pas celui du ressort (ou plus précisément
code> dans votre test n'est pas une instance de
transactiontemplaire code>, C'est
exécutant () code> dessus devrait se comporter. P>
Comment je vais le réparer h2>
Comment vous pouvez, mais IMHO ne devrait pas, corrigez-le. h2>
dointransaction () code> méthode. Dans ce cas, vous le créeriez à l'aide de
Nouveau code>, définissant un simule
DatawareHousemessagedao code> et simplement votre
vérifie () code>. P>.
Merci de répondre. J'ai résolu ce problème en ajoutant une annotation @TransAderal à ma méthode, donc pas besoin de créer des méthodes anonymes plus et que la création de test est devenue plus facile.
Vous ne devriez pas changer votre code, c'est vrai. Dans votre test de l'unité, au lieu de la vérification ISA, vous devez utiliser C'est vrai que dans ce test, vous allez tester deux choses à la fois, mais ce n'est qu'à cause de votre mise en œuvre et je ne dis pas que c'est faux. Créer de nouvelles instances avec une certaine logique d'entreprise augmente toujours le couplage dans votre code, mais cela ne signifie pas que nous ne devrions pas utiliser les capacités linguistiques pour le faire. P>
Voici une autre façon de traiter avec transactiontemplate (Java 8 +): Cette solution exécutera le code dans cette fausse transaction et vous pouvez vérifier la réponse ensuite. P> p>