2009-05-27 3 views
1

스텁을 빌드하는 데 필요한 거대한 클래스가 있습니다.자바에서 자동 스텁. 무엇을 사용할 것인가?

그림을 그리는 것은 GWT의 메시지 클래스입니다. 종종 이것은 String을 반환하는 수십 가지 메서드를 가진 클래스입니다.

JMock을 사용하면 스터 빙을 할 수 있지만 각 방법을 허용하는 것으로 끝날 것입니다 ... 이것은 내가보고 싶은 것이 아닙니다.

각 방법마다 스텁을 자동으로 작성하는 무언가가 있습니까? 빈 문자열처럼 미리 정의 된 값을 반환하려면이 메서드가 필요하지만 모든 제안이 만족 스러울 것입니다.

답변

1

JMock에서는 명시 적 결과로 관심있는 메소드를 허용 한 다음 메소드가 포함되지 않은 허용 문과 함께 메시지 객체의 다른 메소드를 허용 할 수 있습니다. 예컨대 :

allowing(m).getBlah("something"); 
    will(returnValue("foo")); 
allowing(m); // matches anything else, will return some default value if called 

하지만 ...

그냥 getter 메소드의 무리 스텁하는 경우, 모의 객체 프레임 워크를 사용하는 잘못된 도구입니다. 모의 객체는 테스트중인 객체가 환경에 변화를주기 위해 인접한 객체에 올바른 명령을 보내는 지 테스트하는 데 사용됩니다.

getter 만 포함하는 인터페이스 인 경우 스텁 클래스를 만드는 것이 더 쉽습니다. 또는 Usurper을 사용하여 스텁을 자동으로 생성 할 수 있습니다.

+0

허락 해 주셔서 감사합니다 (m); 이건 내가 찾던 .. 툴링의 선택과 관련하여 스텁 클래스의 문제점은 실제 인터페이스에서 뭔가를 할 때마다 새로 고침해야한다는 것입니다. 그래서 자동으로 스텁을 만드는 무언가가 필요합니다. 살인자는 좋다, 나는 이것을 시도 할 것이다. –

0

EasyMock을 사용하는 경우 실제로 호출하고 사용할 것으로 예상되는 메소드에 대해 동작/기대/스텁을 지정하기 만하면됩니다.

JMock과 EasyMock을 모두 사용한 후에 EasyMock의 API가 약 10 배 더 사용하기 쉽고 인터페이스가 대부분 정적으로 유형화되었으므로 리팩터링도 안전하다고 (즉, 메소드 이름에 문자열을 사용하는 등)).

+0

감사합니다,하지만이 분야의 JMock 및 EasyMock에에 .. 모두 정적으로 입력 된 인터페이스를 제공합니다 ... 동일합니다 그리고 난 아마 ... –

+0

를 인터페이스에있는 모든 일치 뭔가 paticular 기능을 보았다 thats JMock 1 대 JMock 2 변경, 난 단지 버전 1을 사용했습니다 ... –

+0

예. 우리는 Tammo에서 마침내 배웠고 문자열 메서드 이름을 제거했습니다. 비록 우리가 그 트레이드 오프에서 잃어버린 것들이 있지만 –

1

인터페이스의 경우 java.lang.reflect.Proxy의 기능을 사용할 수 있습니다. 당신이 MessageConstants 클래스에 대한 답변을 스텁하고자한다고 가정하면, 코드는 유사합니다 :

 InvocationHandler handler = new InvocationHandler() { 

     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 

      if (String.class.equals(method.getReturnType())) 
       return "proxy generated method return"; 

      throw new AbstractMethodError("Not implemented"); 
     } 
    }; 
    Class<?> proxyClass = Proxy.getProxyClass(MessageConstants.class.getClassLoader(), new Class[] { MessageConstants.class }); 
    MessageConstants messageConstants = (MessageConstants) proxyClass.getConstructor(new Class[] {InvocationHandler.class}).newInstance(new Object[] { handler }); 

    System.out.println(messageConstants.description()); 

    messageConstants.getBoolean("someBoolean"); 

나머지는 단지 배관 동안,

proxy generated method return 
Exception in thread "main" java.lang.Error: Not implemented 
at xxx.Application$1.invoke(Application.java:48) 
at $Proxy0.getBoolean(Unknown Source) 
at xxx.Application.main(Application.java:64) 

의 InvocationHandler는 스터 빙 드라이브가 발생합니다.

+0

이것은 매우 유익한 답변입니다. 미안하지만 두 가지 답변을 표시 할 수 없습니다. 대단히 감사합니다. –

1

당신이 대답을 찾게되어 반갑습니다. 추가 정보를 얻기 위해 jMock은 메서드 일치 방법에 대한 매우 유연한 사양을 허용합니다 (http://www.jmock.org/match-object-or-method.html 참조). 예를 들어 다음과 같은 작업을 수행 할 수 있습니다.

allowing (any(Object.class)).method("get.*").withNoArguments(); 

S

+0

감사합니다. 나는 이것을 시도 할 것이다. –

관련 문제