정적 방법으로 조롱하는 방법?
-
03-07-2019 - |
문제
나는 모의 물체를 처음 접했지만 수업을 조롱하기 위해 수업을 구현해야한다는 것을 이해합니다.
내가 가진 문제는 데이터 액세스 계층에서 정적 메소드를 원하지만 인터페이스에 정적 메소드를 넣을 수 없다는 것입니다.
이것에 대한 가장 좋은 방법은 무엇입니까? 인스턴스 메소드를 사용해야합니까 (잘못된 것 같습니다) 다른 솔루션이 있습니까?
해결책
메소드 객체 패턴을 사용합니다. 정적 인스턴스를 가지고 정적 메소드로 호출하십시오. 조롱 프레임 워크에 따라 테스트를 위해 서브 클래스가 가능해야합니다.
정적 방법을 가진 수업에서 :
private static final MethodObject methodObject = new MethodObject();
public static void doSomething(){
methodObject.doSomething();
}
그리고 방법 객체는 매우 간단하고 쉽게 테스트 할 수 있습니다.
public class MethodObject {
public void doSomething() {
// do your thang
}
}
다른 팁
예, 인스턴스 방법을 사용합니다. 정적 방법은 기본적으로 "이 기능을 달성하는 한 가지 방법이 있습니다. 다형성이 아닙니다." 조롱은 다형성에 의존합니다.
이제 정적 메소드가 사용중인 구현에 대해 논리적으로 신경 쓰지 않으면 인터페이스를 매개 변수로 취하거나 상태와 전혀 상호 작용하지 않고 작동 할 수 있지만 인스턴스를 사용해야합니다. 모든 것을 함께 연결하기위한 종속성 주입).
나는 a를 찾았다 Google을 통해 블로그 이 작업을 수행하는 방법에 대한 훌륭한 예제 :
Refactor 클래스 인스턴스 클래스가되고 인터페이스를 구현하려면.
당신은 이미 당신이 이것을하고 싶지 않다고 말했습니다.
정적 클래스 멤버의 대의원과 함께 래퍼 인스턴스 클래스 사용
이렇게하면 대의원을 통해 정적 인터페이스를 시뮬레이션 할 수 있습니다.
정적 클래스를 호출하는 보호 된 멤버와 함께 래퍼 인스턴스 클래스를 사용하십시오.
이것은 단지 상속 받고 확장 할 수 있기 때문에 리팩토링없이 조롱/관리하기가 가장 쉬운 일입니다.
너무 깊은 출발점에서 테스트하려고 할 수 있습니다. 각각의 모든 방법을 개별적으로 테스트하기 위해 테스트를 만들 필요는 없습니다. 개인 및 정적 방법은 개인 및 정적 방법을 차례로 호출하는 공개 방법을 호출하여 테스트해야합니다.
코드가 다음과 같다고 가정 해 봅시다.
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 자 정적 메소드를 조롱 할 수 있습니다.