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>