Aplicar los principios SOLID no solo mejora la arquitectura, también impacta de manera directa en la calidad de las pruebas y en el mantenimiento diario del código. En este capítulo revisamos los beneficios concretos, métricas y ejemplos en Java.
Consideremos el servicio AlertaService
que depende de un Notificador
, similar al visto en capítulos anteriores.
class AlertaService {
private final Notificador notificador;
AlertaService(Notificador notificador) {
this.notificador = notificador;
}
void enviarAlerta(Alerta alerta) {
notificador.notificar(alerta);
}
}
La dependencia invertida permite crear un doble de prueba sin esfuerzos.
class NotificadorStub implements Notificador {
private boolean notificado;
public void notificar(Alerta alerta) {
notificado = true;
}
boolean fueNotificado() {
return notificado;
}
}
@Test
void testEnviaAlerta() {
NotificadorStub stub = new NotificadorStub();
AlertaService service = new AlertaService(stub);
service.enviarAlerta(new Alerta("CPU alta"));
assertTrue(stub.fueNotificado());
}
Sin DIP, el servicio habría instanciado directamente una implementación concreta, obligando a usar recursos reales o a recurrir a frameworks adicionales.
Métrica | Sin SOLID | Con SOLID |
---|---|---|
Tiempo medio para agregar una funcionalidad | 5 días | 2 días |
Defectos regresivos por iteración | 12 | 4 |
Cobertura de pruebas unitarias | 30 % | 80 % |
Tiempo medio de incorporación (onboarding) | 6 semanas | 3 semanas |
Al refactorizar con SOLID, los tests dejan de ser un simple guardián y pasan a ser documentación ejecutable. Un ejemplo es un test parametrizado que describe cómo debe comportarse un repositorio.
@ParameterizedTest
@MethodSource("repositorios")
void testGuardarYRecuperar(RepositorioOrdenes repositorio) {
Orden orden = OrdenFactory.crear();
repositorio.guardar(orden);
assertTrue(repositorio.existe(orden.id()));
}
static Stream<RepositorioOrdenes> repositorios() {
return Stream.of(new RepositorioOrdenesJdbc(dataSource()),
new RepositorioOrdenesEnMemoria());
}
El test garantiza que todas las implementaciones respeten el contrato, reforzando LSP y permitiendo agregar variantes sin temer regresiones.
Los principios SOLID potencian la calidad del software cuando se combinan con una estrategia de pruebas robusta. En el próximo tema exploraremos buenas prácticas complementarias que consolidan estos beneficios en el largo plazo.