mam zasilacz od I1
do ILogger
realizowanego tak:Jak napisać JUnit dla Adaptera bez skomplikowanego kodu?
class BAdapter() implements I1
{
void logA() { // nothing }
void logB() { new BLogger().log() }
void logC() { // nothing }
}
chciałbym napisać testu JUnit, że sprawdzenie funkcjonalności, ale uważam, że to nieco problematyczne, ponieważ nie mogę wprowadzić mój atrapa obiektu zamiast z BLogger
lub sprawdź wartość zwracaną. Znalazłem kilka możliwych rozwiązań, ale nie jestem pewien, który jest najlepszy.
Sprawa pierwsza: Dodaj void setLogger(Logger l)
do klasy 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
}
Minusy: Dlaczego dodać setter, które nigdy nie jest używane w „prawdziwym”, kod zakaz testowania?
Sprawa druga: dodawania chroniony metoda fabryki i sublcass BAdapter
w pakiecie testowym.
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() }
}
Minusy: Nie jestem pewien, czy to jest czyste i eleganckie rozwiązanie, ale nie widzę tutaj zbyt wielu wad.
Przypadek trzeci: Użyj wzoru fabryka abstrakcyjna.
class BAdapter() implements I1
{
public void logB() { AbstractFactory.getFactory().getBLogger().log() }
.. //rest of methods
}
A gdzieś w testach:
AbstractFactory.setFactory(new MockLoggersFactory())
Wady: To jest zbyt skomplikowane, prawda?
Przypadek czwarty: Zwraca wartość logiczną, na przykład po przeprowadzeniu rejestrowania. Na przykład.
class BAdapter() implements I1
{
Boolean logA() { return false; }
Boolean logB() { return new BLogger().log() }
Boolean logC() { return false; }
}
Minusy: To rodzaj wourkaround. Dlaczego warto zwrócić jakąś wartość, gdy nikt jej nie potrzebuje w "prawdziwym", nie testującym kodzie?
Lepsze rozwiązanie? Czy jest coś lepszego?
Znalazłem podobne podejście w JUnit w książce Action. Kod testowy jest klientem twojego kodu, tak jak każdy inny, więc dobrze jest ponownie przeliczyć lub zaktualizować kod zgodnie z wymaganiami testu jednostki. –