Le logger de la mort
Par bastien, le jeudi 04 f´vrier 2010 à 16:24 | Java
Parfois, au cours d'une mission chez un client, on tombe sur du code pas testé, et pas toujours prévu pour être testé non plus. Je vais présenter un cas sur lequel je suis tombé récemment, issu d'un assez gros projet Java EE en cours de développement.
Une classe de services X effectue une certain nombre de traitements. En cas d'erreur, au lieu de jeter une exception métier, un code d'erreur est loggué. Impossible d'utiliser un@Test(expected=...)
, donc. Fort heureusement, le champ logger dans X est une interface, potentiellement mockable :
interface Ilogger { public abstract void logError(final Key key, final Object... messages); // blabla }Dans tous les cas où nous sommes intéressés, la méthode logError est appelée avec un paramètre Key représentant le code d'erreur. Malheureusement, le logger n'est pas injecté dans un setter, et il est privé. On aimerait tout de même vérifier que l'erreur est bien logguée sous certaines conditions. Solution, un peu de réflexion pour forcer le champ logger à une instance que l'on contrôle :
public class MockLogger implements ILogger { private List<Key> loggedKeys; public MockLogger() { super(); loggedKeys = new ArrayList<Key>(); } public void logError(Key key, Object... messages) { loggedKeys.add(key); } public boolean wasLogged(Key key) { return loggedKeys.contains(key); } public void resetLogCalls() { loggedKeys.clear(); } }La méthode
resetLogCalls
permet d'utiliser la même instance du logger sur plusieurs tests, il faut l'appeler dans une méthode annotée @After
.
Il faut maintenant injecter notre propre logger dans le service testé :
Field f = serviceUnderTest.getClass().getDeclaredField("logger"); f.setAccessible(true); f.set(serviceUnderTest, myLoggerInstance); f.setAccessible(false);Et voila, nous pouvons maintenant faire des
assertTrue
utilisant la méthode wasLogged
et la Key nous intéressant ! Notez l'appel à Field#setAccessible(boolean)
pour contourner le caractère private du champ logger
(que l'on restaure par la suite).
Note : si le logger n'avait pas utilisé d'interface, nous aurions pu nous en sortir en créant une classe fille redéfinissant toutes les méthodes sans appels à super()
.
Commentaires
Par CHAUFFEUR PRIVE NICE le samedi 23 avril 2016 à 19:00
Par which vpn for soccer le mercredi 12 décembre 2018 à 18:43
Par how good is express vpn le dimanche 16 décembre 2018 à 17:08
Par https://www.novaworlds.com.vn/ le mercredi 23 décembre 2020 à 03:12
Par website le mardi 16 f´vrier 2021 à 15:48
Par mobile phone parts le mardi 23 mars 2021 à 01:12
Par slot true wallet ไม่มี ขั้น ต่ํา le mercredi 10 novembre 2021 à 22:13
Par พนันออนไลน์ ฟรี le samedi 27 novembre 2021 à 22:16
Par พนันออนไลน์ ฟรี le samedi 27 novembre 2021 à 23:36
Par Available Here le jeudi 03 mars 2022 à 08:54