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.

Cómo escribir casos de JUnit para @Bean en clases de configuración

Tengo el siguiente método en la clase @Configuration y necesito escribir pruebas JUnit para esto. ¿Alguien puede guiarme para lograr el caso de prueba JUnit?

@Bean
@Profile({"!test & !local"})
@Primary
public DiscoveryClient.DiscoveryClientOptionalArgs getClient() {
    try {
        DiscoveryClient.DiscoveryClientOptionalArgs args = new DiscoveryClient.DiscoveryClientOptionalArgs();
        args.setAdditionalFilters(Collections.singletonList(new HTTPBasicAuthFilter(this.username, this.password)));
        args.setSSLContext(sslContext());
        System.setProperty("javax.net.ssl.trustStore", this.truststorePath);
        System.setProperty("javax.net.ssl.trustStorePassword", this.trustStorePassword);

        return args;
    } catch (IOException | KeyManagementException | KeyStoreException | NoSuchAlgorithmException | CertificateException e) {
        throw new IllegalStateException("No se puede instanciar el contexto SSL o la autenticación", e);
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para escribir un caso de prueba JUnit para este método, necesitas crear una clase de prueba y utilizar la anotación @Test para marcar tus métodos de prueba. Aquí tienes un ejemplo de cómo puedes escribir un caso de prueba JUnit para el método anterior:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @ActiveProfiles("test")
    public class DiscoveryClientConfigurationTest {
    
        private static final String USERNAME = "testuser";
        private static final String PASSWORD = "testpassword";
        private static final String TRUSTSTORE_PATH = "/ruta/hacia/el/almacén/confiable";
        private static final String TRUSTSTORE_PASSWORD = "testpass";
    
        @Autowired
        private ApplicationContext context;
    
        @Test
        public void testGetClient() throws Exception {
            // Inicializar los valores de prueba
            DiscoveryClientConfiguration config = context.getBean(DiscoveryClientConfiguration.class);
            config.setUsername(USERNAME);
            config.setPassword(PASSWORD);
            config.setTruststorePath(TRUSTSTORE_PATH);
            config.setTrustStorePassword(TRUSTSTORE_PASSWORD);
    
            // Llamar al método y obtener el resultado
            DiscoveryClient.DiscoveryClientOptionalArgs result = config.getClient();
    
            // Verificar el resultado
            assertNotNull(result);
            assertEquals(1, result.getAdditionalFilters().size());
            assertEquals(HTTPBasicAuthFilter.class, result.getAdditionalFilters().get(0).getClass());
            assertEquals(sslContext(), result.getSSLContext());
        }
    
        private SSLContext sslContext() throws Exception {
            return SSLContextBuilder.create()
                    .loadTrustMaterial(new File(TRUSTSTORE_PATH), TRUSTSTORE_PASSWORD.toCharArray())
                    .build();
        }
    }
    

    En el caso de prueba anterior, puedes ver que estamos inicializando los valores de prueba para username, password, truststorePath y trustStorePassword, y luego llamamos al método getClient(). Después de eso, verificamos la salida del método utilizando el método assertEquals(). Aquí, estamos verificando que el objeto result no sea nulo, que tenga un filtro adicional y que el SSLContext coincida con el valor generado por sslContext() utilizando SSLContextBuilder.

    Puedes ejecutar esta clase de prueba utilizando cualquier ejecutador de JUnit, pero se recomienda utilizar SpringRunner.class como se muestra arriba para ejecutar la prueba en un contexto de Spring, lo que te permite utilizar @Autowired para cargar las dependencias requeridas.

Comments are closed.