EasyMock La Gestion Des Exceptions
Je suis la création de certains de test junit cas, l'aide d'EasyMock. Jusqu'à présent, il fait sens pour les classes, je m'attends au retour de Pojo, mais comment dois-je gérer affaire à un objet DAO que lui-même pouvait lever une exception. Mon cas de test est de vérifier à une exception levée lorsque le DAO rencontre un problème. À l'aide de EasyMock j'ai essayer et de se moquer de l'objet de DAO (test de la foo
classe), ce qui est la bonne façon de gérer le niveau inférieur DAO exception.
Un exemple de classes/appels simples ci-dessous: (en Assumer toutes les getters/setters/constructeurs sont valides et présent)
public class foo{
private daoClass dao = daoClass.getInstance();
public String getValueFromDB(String key) throws DBException{
return dao.lookup(key);
}
}
public class daoClass{ //singleton DAO
public daoClass getInstance(){
//singleton access here
}
public String lookup(String key) throws DBException{
try{
//DB LOGIC
}
catch(Exception e){
throw new DBException(e.getMessage());
}
}
}
Quand je l'ai essayer et de tester la foo
classe, je veux être en mesure de tester cette DBException. Comment dois-je faire, dois-je être environnant les DAO appel dans un try/catch (dans le test), ou ajouter un jette à l'épreuve? Je sais expected=DBException
va passer le test s'est levée, mais comment syntaxiquement devrait vous gérer n'importe quel nombre d'exceptions internes?
Code de Test Exemple:
@Test(expected=DBException.class)
public void testFooError(){
String key = "test";
String value = "expected";
daoClass daoMock = createMock(daoClass.class);
try{
expect(daoMock.lookup(key)).andReturn(value);
} catch (DBException e){
//???
}
}
Quelle est la manière correcte de traiter lorsque le expect
pourrait potentiellement générer des erreurs? Si la méthode d'essai throw
l'exception, ou si un try/catch
être utilisé? Est-il toujours correct d'utiliser le expected=EXCEPTION
tag sur le test?
OriginalL'auteur Walls | 2013-03-01
Vous devez vous connecter pour publier un commentaire.
Voici comment je gérer les exceptions dans les tests unitaires:
Si vous ne sont pas explicitement le test pour l'exception, alors vous devriez ajouter une clause throws de la méthode - si l'exception a été levée et vous ne vous attendiez pas à être jetés, alors que c'est un test échoue.
par exemple,
Si vous sont explicitement le test pour l'exception, puis mettre un try-catch autour de la ligne, vous vous attendez à être levée à partir de (la capture la plus petite version de l'Exception que vous attendez), puis de définir un boolean dans la clause catch et l'assertion doit être sur la valeur du booléen.
par exemple,
C'est un bon moyen de tester des exceptions, car elle signifie que vous êtes tester non seulement que la bonne exception est levée, mais aussi qu'il est lancé à partir d'exactement la ligne que vous attendez. Si vous utilisez @test(prévu=...) puis une autre ligne dans le test pourrait jeter l'exception et le test pourrait mal à passer.
(expected=Exception.class)
doit être laissé dans ce cas?oui, pas besoin de le mettre sur dans ce cas.
Clarification rapide sur le
exceptionThrown
logique... dois-je attendre de cette exception autour de laexpect
appel à la EasyMock objet, ou dois-je utiliser cette logique plus loin dans le code de test lorsque je suis en fait en utilisant le prototype de l'Objet et de vouloir l'attraper à feu.try{ expect() } catch { DO NOTHING } ...
try{foo.getValueFromDB(value)} catch (Exception e) { exceptionThrown = true;}
OriginalL'auteur combinatorics
Votre DAO logique ne devrait pas changer en fonction de votre test . Si vous attendez votre DAO pour lancer l'exception, puis le garder de cette façon et test de l'Exception à la façon dont vous souhaitez tester .
Si vous êtes à la capture de l'exception dans DAO lui-même pour faire la restauration ou à l'exploitation forestière, etc. puis le Test de Cas ne devrait pas s'attendre à une Exception, comme il n'est pas un cas de test du scénario. Vous pouvez vérifier la valeur NULL dans ce cas j'attends vos DAO sera de retour NULL .
OriginalL'auteur Avinash Singh