문제

클래스 A가 있다고 말합니다

class A {
  final String foo() {
    // .. computing result, contacting database, whatever ..
    return "some computed value";
  }
  // ... and a bazillion other methods, some of them final.
}

이제 나는 클래스 B를 가지고 있습니다

class B {
  String methodIWantToTest(A a) {
      String output = a.foo();
      // ... whatever this method does, e.g.:
      output += "_suffix";
      return output;
  }
}

이 방법을 테스트하는 장치는 어떻게해야합니까? 이유 foo() 최종적입니다. 기능을 변경하기 위해 수업을 확장하는 수업을 원하지 않기 때문입니다. 그러나 동시에이 방법을 진정으로 테스트하기 위해이 방법을 테스트하기 위해서는 실제에 연락하고 실행하는 것을 원하지 않습니다. A.foo() 방법.

최종 키워드를 제거하고 라인을 따라 주석을 추가하는 방법이 있습니까? @finalUnlessTest? 어떤 것을 권 하시죠? 인터페이스에 a를 리팩토링하는 것은 매우 어려울 것입니다. 매우 어려울 것입니다. 그것이 우리의 중앙 클래스 중 하나이며 불행히도 어떻게되는지 보는 것은 매우 어려울 것입니다. 예쁜 매우 결합되었습니다.

#1 편집 죄송합니다. 언급하는 것을 잊었습니다. 우리는 Java를 말하고 있습니다. 우리는 아직 조롱 프레임 워크를 사용하지 않습니다.

대답 좋아요 : 와우. jmockit 그냥 놀랍고 레거시 코드를 테스트하기위한 킬러 앱입니다. 특히 제 경우에는 믿을 수 없을 정도로 유용합니다. 정말 고마워! 당신은 기본적으로 내 psuedo-example에 대해 다음과 같은 일을 할 것입니다.

class AMock {
   final String foo() {
     return "myTestValue";
   }
}
class Test extends TestCase {
   A mockedA;
   B b;
   protected void setUp() {
      Mockit.redefineMethods( A.class, AMock.class );  // this "pipes" all mocked methods from A to AMock
      mockedA = new A();    // NOT new AMock()!!!
      b = new B();
   }
   public void testB() {
      assertEquals("myTestValue",mockedA.foo());
      assertEquals("myTestValue_suffix",b.methodIWantToTest(mockedA));
   }
}

이게 멋진가요?

도움이 되었습니까?

해결책

당신은 시도 할 수 있습니다 jmockit 조롱 라이브러리.

다른 팁

나는 "최종"을 제거하고 단지 "이 방법을 무시하지 마십시오 !!"라고 주석을 넣었습니다. 동료가 간단한 지시를 따르지 않는다고 믿을 수 없다면 어쨌든 희망이 없습니다.

다음 코드를 사용하면이를 수행 할 수 있습니다. 나는 이것이 좋은 연습이라고 말하지는 않지만 익명의 수업의 흥미로운 용도 (남용?)입니다.

public class Jobber {

    public final String foo() {
        return fooFactory() ;
    }

    String fooFactory() {
        return "jobber" ;
    }


    public static void main(String[] args) {

        Jobber jobber = new Jobber() { String fooFactory() { return "prefix " + super.fooFactory() ;} } ;

        System.out.println(jobber.foo() );
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top