2011-08-22 3 views
1

자체 내에 많은 수의 컬렉션을 만들어야하는 클래스에 대한 JMock 테스트를 작성하고 있습니다. 필요한 경우 Collection을 생성하는 팩토리를 클래스에 제공하고 있습니다.JMock 일반 반환 형식

interface Factory 
{ 
    <T> Collection<T> newCollection(); 
} 

class MyClass 
{ 
    public MyClass(Factory f) 
    { 
     List<ThingA> la = f.newCollection(); 
     List<ThingB> lb = f.newCollection(); 
    } 
} 

이제는 작동하지만 JMock을 사용하여 "MyClass"를 테스트하면이 반환 유형 오버로드를 조롱 할 수 없습니다.

Collection<ThingA> ta = new LinkedList<ThingA>(); 
Collection<ThingB> tb = new LinkedList<ThingB>(); 
Collection<ThingC> tc = new LinkedList<ThingC>(); 

Factory mockFactory = context.mock(Factory.class); 
context.checking(new Expectations() 
{ 
    { 
     allowing(mockFactory).newCollection(); will(returnValue(ta)); 
     allowing(mockFactory).newCollection(); will(returnValue(tb)); 
     allowing(mockFactory).newCollection(); will(returnValue(tc)); 
    } 
} 
); 

// All return ta 
Collection<ThingA> ta2 = mockFactory.newCollection(); 
Collection<ThingB> tb2 = mockFactory.newCollection(); 
Collection<ThingC> tc2 = mockFactory.newCollection(); 

작동 시키려면 어떤 방법이 있습니까? 나는 ThingX를 인자로 전달할 수 있다는 것을 알고 있지만 테스팅을 위해 타입 검사를 트리거하는 것이면 그것은 약간 의미가없는 것처럼 보입니다.

현재의 수정 사항은 newCollection에 대한 호출 순서를 적용 할 수 있도록 시퀀스를 추가하는 것이지만 이것이 작동하지 않는 상황을 볼 수 있습니다 (제네릭 유형 풀링).

이 작업을 수행 할 수 있습니까?

답변

1

유형 삭제가 진행되고 있습니다. 앞에서 언급 한대로 ThingX (또는 ThingX.class)을 전달하기 만하면됩니다. 불행하게도, 지우개를 입력하면 hacky 일을하게됩니다.

코드를 일반 인식 및 일반 인식이 아닌 두 영역으로 나누어 생각하는 것이 가장 좋습니다. 또한 나중에 하나에서 전으로 접착제를 사용해야하는 경우에는 다음 중 하나를 수행 할 수 없습니다. 두 (통제하에 일을 유지하기위한) :

중 하나 (당신이 제안) 단지 유형 검사를 트리거 패스 매개 변수 : 방법에

Collection<ThingA> ta2 = mockFactory.newCollection(ThingA.class); 
Collection<ThingB> tb2 = mockFactory.newCollection(ThingB.class); 
Collection<ThingC> tc2 = mockFactory.newCollection(ThingC.class); 

또는 캡슐 제네릭 인식 코드됩니다) 제네릭 인식 , b) 한 도메인에서 다른 도메인으로 지정할 때 발생하는 경고를 표시하지 않으려면 @SuppressWarnings("unchecked") 주석을 사용하십시오.

class MockFactoryThingie 
{ 
    /** 
    *@SuppressWarnings("unchecked") 
    */ 
    Collection<ThingA> newThingACollection() 
    { 
    return (Collection<ThingA>) ... your generic-unaware collection thing... 
    } 
} 

어느 쪽이든 clunky입니다. 우리는 자바/JCP 대 군주에게 우리에게 타입 지우는 보석을 주신 것에 대해 감사해야합니다 :)

+0

자바가 올바른 반환 유형을 만들 수 있다는 것은 부끄러운 일입니다. 돌아 왔지만, JMock은 이것을 할 수 없습니다. 이 영역의 코드는 모두 제네릭을 인식한다고 생각합니다. JMock은 반환 유형을 기반으로 제네릭을 사용할 수 없다는 것을 알고 있습니다. 일반적인 접근 방식이 신경 쓰지 않는 동안 내가 만들고 싶고 원하는 함수를 만들 필요가있는 모든 유형을 알아야하기 때문에 두 번째 옵션이 작동하는지 확신 할 수 없습니다. 어쩌면 내가 뭔가를 놓친 것 같아. –

+1

아, 뭔가 놓쳤습니다. 모의 공장을 만들었다는 것을 알지 못했습니다. JMock을 사용하면 손에서 벗어나 가짜를 만들 수 있습니다. 아마 그렇지 않은 것 같아요 :) –

+0

실망 시키셔서 죄송합니다. 매트 :)하지만 네가 찾고있는 것을 구현하려면 네가 수동으로 조롱을해야 할 것이다. 그것은 고상한 목표이지만 유감스럽게도 유형 삭제는 Java에서 불가능하게 만듭니다. 타입 지우기가 없다면, 당신이 찾는 것이 가능할 것입니다. 내가 뭐라 할 수 있니? 타입 지우기는 빨기 :) –