tengo un adaptador del I1
a ILogger
implementado como esto:Cómo escribir JUnit para Adapter sin código demasiado complicado?
class BAdapter() implements I1
{
void logA() { // nothing }
void logB() { new BLogger().log() }
void logC() { // nothing }
}
me gustaría escribir prueba unitaria, para verificar el funcionamiento, pero me pareció un poco problemático, ya que no puedo inyectar mi objeto de burla en su lugar de BLogger
, o verifique el valor de retorno. Encontré varias soluciones posibles, pero no estoy seguro, cuál es la mejor.
Caso uno: Añadir void setLogger(Logger l)
a la clase BAdapter
.
class BAdapter() implements I1
{
private Logger logger = new BLogger();
public void logB() { logger.log() }
public void setLogger(Logger l) { logger = l }
.. //rest of methods
}
Contras: ¿Por qué añadir colocador que nunca se utiliza en "real", el código no pruebas?
Caso dos: Agregar método de fábrica protegido y sublcass BAdapter
en el paquete de prueba.
class BAdapter() implements I1
{
public void logB() { createLogger().log() }
protected Logger createLogger() { retrun new BLogger() }
.. //rest of methods
}
class BAdapterForTesting extends BAdapter()
{
protected Logger createLogger() { retrun new MockBLogger() }
}
Contras: No estoy seguro, si esta es una solución limpia y elegante, pero no veo muchas desventajas aquí.
Caso tres: Utilice el patrón Abstract Factory.
class BAdapter() implements I1
{
public void logB() { AbstractFactory.getFactory().getBLogger().log() }
.. //rest of methods
}
Y en algún lugar en las pruebas:
AbstractFactory.setFactory(new MockLoggersFactory())
Contras: Esto es demasiado complejo, ¿no es así?
la caja cuatro: Retorno de Boole, por ejemplo, cuando se llevó a cabo el registro. P.ej.
class BAdapter() implements I1
{
Boolean logA() { return false; }
Boolean logB() { return new BLogger().log() }
Boolean logC() { return false; }
}
Contras: Esto es una especie de wourkaround. ¿Por qué devolver algún valor, cuando nadie lo necesita en un código "real" sin pruebas?
¿Mejor solución? ¿Hay algo mejor?
Encontré un enfoque similar en JUnit in Action book. El código de prueba es el cliente de su código como cualquier otro, por lo que es bueno volver a factorizar o actualizar el código para adaptarse a los requisitos de prueba de la unidad. –