문제

나는 모의 물체를 처음 접했지만 수업을 조롱하기 위해 수업을 구현해야한다는 것을 이해합니다.

내가 가진 문제는 데이터 액세스 계층에서 정적 메소드를 원하지만 인터페이스에 정적 메소드를 넣을 수 없다는 것입니다.

이것에 대한 가장 좋은 방법은 무엇입니까? 인스턴스 메소드를 사용해야합니까 (잘못된 것 같습니다) 다른 솔루션이 있습니까?

도움이 되었습니까?

해결책

메소드 객체 패턴을 사용합니다. 정적 인스턴스를 가지고 정적 메소드로 호출하십시오. 조롱 프레임 워크에 따라 테스트를 위해 서브 클래스가 가능해야합니다.

정적 방법을 가진 수업에서 :

private static final MethodObject methodObject = new MethodObject();

public static void doSomething(){
    methodObject.doSomething();
}

그리고 방법 객체는 매우 간단하고 쉽게 테스트 할 수 있습니다.

public class MethodObject {
    public void doSomething() {
        // do your thang
    }
}

다른 팁

예, 인스턴스 방법을 사용합니다. 정적 방법은 기본적으로 "이 기능을 달성하는 한 가지 방법이 있습니다. 다형성이 아닙니다." 조롱은 다형성에 의존합니다.

이제 정적 메소드가 사용중인 구현에 대해 논리적으로 신경 쓰지 않으면 인터페이스를 매개 변수로 취하거나 상태와 전혀 상호 작용하지 않고 작동 할 수 있지만 인스턴스를 사용해야합니다. 모든 것을 함께 연결하기위한 종속성 주입).

나는 a를 찾았다 Google을 통해 블로그 이 작업을 수행하는 방법에 대한 훌륭한 예제 :

  1. Refactor 클래스 인스턴스 클래스가되고 인터페이스를 구현하려면.

    당신은 이미 당신이 이것을하고 싶지 않다고 말했습니다.

  2. 정적 클래스 멤버의 대의원과 함께 래퍼 인스턴스 클래스 사용

    이렇게하면 대의원을 통해 정적 인터페이스를 시뮬레이션 할 수 있습니다.

  3. 정적 클래스를 호출하는 보호 된 멤버와 함께 래퍼 인스턴스 클래스를 사용하십시오.

    이것은 단지 상속 받고 확장 할 수 있기 때문에 리팩토링없이 조롱/관리하기가 가장 쉬운 일입니다.

너무 깊은 출발점에서 테스트하려고 할 수 있습니다. 각각의 모든 방법을 개별적으로 테스트하기 위해 테스트를 만들 필요는 없습니다. 개인 및 정적 방법은 개인 및 정적 방법을 차례로 호출하는 공개 방법을 호출하여 테스트해야합니다.

코드가 다음과 같다고 가정 해 봅시다.

public object GetData()
{
 object obj1 = GetDataFromWherever();
 object obj2 = TransformData(obj1);
 return obj2;
} 
private static object TransformData(object obj)
{
//Do whatever
}

TransformData 메소드에 대한 테스트를 작성할 필요는 없습니다 (그리고 할 수 없습니다). 대신 transformData에서 수행 된 작업을 테스트하는 getData 메소드에 대한 테스트를 작성하십시오.

가능한 경우 인스턴스 방법을 사용하십시오.

인스턴스 방법이 불가능한 경우 공개 정적 기능 [t, u] (모의 함수로 대체 할 수있는 정적 함수 참조)을 사용하십시오.

간단한 솔루션은 세터를 통해 정적 클래스의 구현을 변경할 수있는 것입니다.

class ClassWithStatics {

  private IClassWithStaticsImpl implementation = new DefaultClassWithStaticsImpl();

  // Should only be invoked for testing purposes
  public static void overrideImplementation(IClassWithStaticsImpl implementation) {
     ClassWithStatics.implementation = implementation;
  }

  public static Foo someMethod() {
    return implementation.someMethod();
  }

}

테스트 설정에서 overrideImplementation 조롱 된 인터페이스로. 이점은 정적 클래스의 클라이언트를 변경할 필요가 없다는 것입니다. 단점은 정적 클래스의 메소드를 반복하고 구현되기 때문에 약간의 복제 된 코드가있을 것입니다. 그러나 때로는 정적 메소드가 기본 기능을 제공하는 Ligther 인터페이스를 사용할 수 있습니다.

당신이 가진 문제는 타사 코드를 사용하는 경우 방법 중 하나에서 호출됩니다. 우리가 한 일은 객체에 래핑하고 Dep Inj로 전달하는 것입니다. 그런 다음 장치 테스트는 제 3 자 정적 메소드를 조롱 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top