자체 내에 많은 수의 컬렉션을 만들어야하는 클래스에 대한 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에 대한 호출 순서를 적용 할 수 있도록 시퀀스를 추가하는 것이지만 이것이 작동하지 않는 상황을 볼 수 있습니다 (제네릭 유형 풀링).
이 작업을 수행 할 수 있습니까?
자바가 올바른 반환 유형을 만들 수 있다는 것은 부끄러운 일입니다. 돌아 왔지만, JMock은 이것을 할 수 없습니다. 이 영역의 코드는 모두 제네릭을 인식한다고 생각합니다. JMock은 반환 유형을 기반으로 제네릭을 사용할 수 없다는 것을 알고 있습니다. 일반적인 접근 방식이 신경 쓰지 않는 동안 내가 만들고 싶고 원하는 함수를 만들 필요가있는 모든 유형을 알아야하기 때문에 두 번째 옵션이 작동하는지 확신 할 수 없습니다. 어쩌면 내가 뭔가를 놓친 것 같아. –
아, 뭔가 놓쳤습니다. 모의 공장을 만들었다는 것을 알지 못했습니다. JMock을 사용하면 손에서 벗어나 가짜를 만들 수 있습니다. 아마 그렇지 않은 것 같아요 :) –
실망 시키셔서 죄송합니다. 매트 :)하지만 네가 찾고있는 것을 구현하려면 네가 수동으로 조롱을해야 할 것이다. 그것은 고상한 목표이지만 유감스럽게도 유형 삭제는 Java에서 불가능하게 만듭니다. 타입 지우기가 없다면, 당신이 찾는 것이 가능할 것입니다. 내가 뭐라 할 수 있니? 타입 지우기는 빨기 :) –