Unidad de Pruebas un método estático

tanvi:

Estoy tratando de escribir un caso de prueba para el método de descifrado aquí.

    private static Codec codec;

    static {
        try {
            codec = new Codec(encryptionType, encryptionKey, false, true, false);
        } catch (CodecException e) {
            throw new RuntimeException("Codec initialisation failed", e);
        }
    }


    public static String decrypt(final String toDecrypt) throws CodecException {
        String decrypted = codec.decryptFromBase64(toDecrypt);
        if (decrypted.endsWith(":")) {
            decrypted = decrypted.substring(0, decrypted.length() - 1);
        }
        return decrypted;
    }

Caso de prueba:

    @Mock
    private Codec codec;
    @Test
    public void test_decrypt_Success() throws CodecException {
        when(codec.decryptFromBase64(TestConstants.toDecrypt)).thenReturn(TestConstants.decrypted);
        assertEquals(DocumentUtils.decrypt(TestConstants.toDecrypt), TestConstants.decrypted);
    }

Dado que este es un método estático, no puede inyectar una instancia de la clase en el conjunto de pruebas y simulaciones su codec. El código anterior genera un error de la biblioteca códec al afirmar como se esperaba.

¿Cuál es su enfoque para probar métodos estáticos como este? O debería no estar escribiendo pruebas para esto en absoluto?

davidxxx:

En Java, los métodos estáticos no están diseñados para las dependencias establecidas.
Por lo tanto cambiar la dependencia en un simulacro no es muy natural.
Se podría proporcionar una staticincubadora para el campo, tales como:

private static Codec codec;
public static void setCodec(Codec codec){
   this.codec = codec;
}

Y se podría establecer una maqueta con setCodec(...), pero uf ...

Pero se olvidan, simplemente hacer las cosas bien: refactorizar el código para eliminar toda la estática e introducir un constructor que establece el códec.

private Codec codec;
public MyClassUnderTest(Codec codec){
   this.codec codec;
}

COI podría ayudar aquí para hacer la clase que se está probando un producto único y facilidad las inyecciones de dependencia.
Si no es posible en su caso, Java 5 enumeración podría ayudarle durante al menos la preocupación Singleton.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=186951&siteId=1
Recomendado
Clasificación