es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué un objeto compañero no se prueba como un campo privado con pruebas JUnit?

Recientemente, tuve que hacer un ejercicio para una clase de programación en Kotlin. Utilizamos las mismas pruebas de JUnit que en el curso de Java y a veces esto puede causar algunos problemas extraños.

En este caso, se suponía que debíamos tener una clase con un método estático al que accederíamos desde otra clase. Dado que no hay métodos estáticos en Kotlin, debíamos usar un objeto compañero con la anotación @JvmStatic, así:

objeto compañero {
    @JvmStatic
    fun parseRationalNumber[...]{
        ...
    }
}

Esto funciona bien. Sin embargo, como realmente no sabía lo que estaba haciendo, terminé nombrando mi objeto compañero así:

objeto compañero Parser {
    @JvmStatic
    fun parseRationalNumber[...]{
        ...
    }
}

Todo seguía funcionando, pero terminó rompiendo una de nuestras pruebas automatizadas de JUnit que comprobaba si habíamos resuelto correctamente el ejercicio:

@Test
void testAllFieldsPrivate() {
    Field[] fields = RationalNumber.class.getDeclaredFields();
    for (Field field: fields) {
        assertTrue(Modifier.isPrivate(field.getModifiers()) || "Companion".equals(field.getName()),
                "The RationalNumber class should have only private instance variables.");
    }
}

Esto me causó problemas durante mucho tiempo mientras buscaba campos que no fueran privados. Al final, manipulé un poco la prueba y descubrí que el campo que causaba problemas se llamaba “Parser”, que era el nombre de mi objeto compañero.

Cuando le pregunté a mi profesor sobre por qué sucedía esto, no pudo darme una respuesta, así que pensé en preguntar aquí. ¿Alguien sabe por qué el objeto compañero nombrado se evaluó como un campo no privado?

Cuando lo miro ahora, la prueba parece hacer una excepción para un objeto compañero llamado “Companion”, que supongo es el nombre predeterminado para un objeto compañero sin nombre. ¿Alguien sabe por qué esto se prueba como un campo no privado?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no tengo la respuesta exacta para esto, pero puedo darle una posible explicación basada en mi entendimiento del código mencionado. La prueba JUnit parece estar verificando todos los campos en la clase RationalNumber para ver si son privados, excepto por el campo del objeto Companion. Esto podría deberse a que el objeto Companion es un tipo especial de objeto en Kotlin que no se trata como un campo regular, sino como miembro estático de la clase. Por lo tanto, la prueba podría no considerarlo como un campo privado regular, en su lugar, tiene su propio nombre reservado “Companion”. Cuando nombró su objeto Companion “Parser”, podría haberlo confundido con un campo regular y fallado en la prueba. Sin embargo, esta es solo una posible explicación basada en el código proporcionado y podría haber más razones detrás de este comportamiento.

Comments are closed.