GovernIB / projectebase

Projecte Base - JBoss 7.2 EAP & Open JDK 11
4 stars 0 forks source link

Revisar warning test mòdul EJB #114

Closed acuevas-dgtic closed 3 years ago

acuevas-dgtic commented 3 years ago
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running es.caib.projectebaseexemple.ejb.converter.TestProcedimentConverter
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.069 s - in es.caib.projectebaseexemple.ejb.converter.TestProcedimentConverter
[INFO] Running es.caib.projectebaseexemple.ejb.converter.TestUnitatOrganicaConverter
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - in es.caib.projectebaseexemple.ejb.converter.TestUnitatOrganicaConverter
[INFO] Running es.caib.projectebaseexemple.ejb.interceptor.TestExceptionTranslatorInterceptor
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.387 s - in es.caib.projectebaseexemple.ejb.interceptor.TestExceptionTranslatorInterceptor
[INFO] Running es.caib.projectebaseexemple.ejb.interceptor.TestLoggerInterceptor
[ERROR] WARNING: An illegal reflective access operation has occurred
[ERROR] WARNING: Illegal reflective access by es.caib.projectebaseexemple.ejb.interceptor.TestLoggerInterceptor (file:/C:/Desarrollo/workspaces/projectebaseexemple/projectebaseexemple-ejb/target/test-classes/) to field java.lang.reflect.Field.modifiers
[ERROR] WARNING: Please consider reporting this to the maintainers of es.caib.projectebaseexemple.ejb.interceptor.TestLoggerInterceptor
[ERROR] WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
[ERROR] WARNING: All illegal access operations will be denied in a future release
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.1 s - in es.caib.projectebaseexemple.ejb.interceptor.TestLoggerInterceptor
[INFO] Running es.caib.projectebaseexemple.ejb.repository.TestAbstractCrudRepository
[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.038 s - in es.caib.projectebaseexemple.ejb.repository.TestAbstractCrudRepository
[INFO] Running es.caib.projectebaseexemple.ejb.repository.TestProcedimentRepository
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 s - in es.caib.projectebaseexemple.ejb.repository.TestProcedimentRepository
[INFO] Running es.caib.projectebaseexemple.ejb.repository.TestUnitatOrganicaRepository
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - in es.caib.projectebaseexemple.ejb.repository.TestUnitatOrganicaRepository
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 28, Failures: 0, Errors: 0, Skipped: 0
antonireus commented 3 years ago

Aquest avís ve per el test TestLoggerInterceptor. Aquesta classe fa els tests unitaris de la classe LoggerInterceptor que és una classe de mostra de com ficar un interceptor als EJB i la seva única funció és produir un log de debug abans i després de la invocació d'un mètode.

Per fer el test unitari amb mockito d'aquesta classe requereix inserir un mock damunt l'objecte que fa els logs, per verificar les interaccions. Però com amb la resta del projecte, el log dins LoggerInterceptor està definit així:

private static final Logger LOG = LoggerFactory.getLogger(LoggerInterceptor.class);

Llavors, la qüestió és de quina manera es pot inserir un objecte Logger mock per verficar les interaccions als tests unitaris si el camp és private i final. I la sol·lució és emprant reflection, que és el que fa el setup de TestLoggerInterceptor

    //allow log field to be changed
    Field field = LoggerInterceptor.class.getDeclaredField("LOG");
    field.setAccessible(true);

    //remove final modifier
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

    //set to mock object
    field.set(null, log);

Aquestes sentències provoquen l'avís indicat.

No se m'ocorr altre manera de fer el test unitari. Tal volta es podria llevar aquest test unitari, o es podria canviar el camp perquè no sigui private i final, però d'altra banda és la manera "correcte" de definir els loggers entenc, i de fet així és com estan definits a totes les classes.

acuevas-dgtic commented 3 years ago

Entonces lo podemos dejar como está,