나는 I1
에서 다음과 같이 구현 ILogger
에 어댑터가 :복잡하지 않은 코드없이 어댑터 용 JUnit을 작성하는 방법은 무엇입니까?
class BAdapter() implements I1
{
void logA() { // nothing }
void logB() { new BLogger().log() }
void logC() { // nothing }
}
내가 JUnit 테스트를 작성하려합니다
, 그 기능을 확인,하지만 난 내 모의 개체를 대신 주입 할 수 없기 때문에 나는 그것이 조금 문제가 발견 BLogger
이거나 반환 값을 확인하십시오. 몇 가지 가능한 해결책을 찾았지만 확실하지 않습니다. 어느 것이 가장 좋습니다.
사례 하나 : 는 BAdapter
클래스에 void setLogger(Logger l)
를 추가합니다.
class BAdapter() implements I1
{
private Logger logger = new BLogger();
public void logB() { logger.log() }
public void setLogger(Logger l) { logger = l }
.. //rest of methods
}
단점 : "실제"테스트 코드가 아닌 세터를 추가하는 이유는 무엇입니까?
사례 2 : 보호 팩토리 방법을 추가하고 테스트 패키지에 BAdapter
을 서브 클래스로 추가하십시오.
단점 : 이것이 깨끗하고 세련된 해결책 인 경우 확실하지 않지만 여기에는 별다른 단점이 없습니다.
사례 3 : 초록 팩토리 패턴을 사용하십시오. 테스트에서
class BAdapter() implements I1
{
public void logB() { AbstractFactory.getFactory().getBLogger().log() }
.. //rest of methods
}
그리고 어딘가에 :
AbstractFactory.setFactory(new MockLoggersFactory())
단점 : 이것은 너무 복잡한가요?
사례 4 : 예를 들어 로깅이 수행 될 때 부울 반환. 예 :
class BAdapter() implements I1
{
Boolean logA() { return false; }
Boolean logB() { return new BLogger().log() }
Boolean logC() { return false; }
}
단점 : 이것은 일종의 wourkaround입니다. "실제"비 테스트 코드에서 아무도 필요하지 않을 때 어떤 가치를 반환해야하는 이유는 무엇입니까?
더 나은 솔루션? 더 좋은게 있나요?
JUnit in Action 서적에서 비슷한 접근법을 발견했습니다. 테스트 코드는 다른 코드와 마찬가지로 코드의 클라이언트이므로 Unit 테스트 요구 사항에 맞게 코드를 다시 팩터링하거나 업데이트하는 것이 좋습니다. –