2017-05-17 4 views
3

동적으로 생성되는 일부 리소스를 모의하려고합니다. 이러한 자원을 생성하려면 클래스 인수를 전달해야합니다. 그래서 예를 들면 :Mockito 특정 일치 클래스 인수

FirstResourceClass firstResource = ResourceFactory.create(FirstResourceClass.class); 

SecondResourceClass secondResource = ResourceFactory.create(SecondResource.class); 

이 잘 나는 조롱하려고 할 때까지 좋다. 그것은 가짜처럼 보인다

PowerMockito.mockStatic(ResourceFactory.class); 
FirstResourceClass mockFirstResource = Mockito.mock(FirstResourceClass.class); 
SecondResourceClass mockSecondResource = Mockito.mock(SecondResourceClass.class); 

PowerMockito.when(ResourceFactory.create(Matchers.<Class<FirstResourceClass>>any()).thenReturn(mockFirstResource); 
PowerMockito.when(ResourceFactory.create(Matchers.<Class<SecondResourceClass>>any()).thenReturn(mockSecondResource); 

가 호출 클래스에 주입되고 있지만, FirstResourceClass은 컴파일 오류가 발생 mockSecondResource을 보내되고있다 :이 같은 일을하고있다.

문제는 내가 (this question에서 얻은) any()를 사용하여 생각합니다. 나는 isA()을 사용해야한다고 생각하지만, Class 인수가 필요하므로 그 메소드 호출을 만드는 방법을 잘 모르겠습니다. 내가 FirstResourceClass.class 시도하고 컴파일 오류가 발생합니다.

+0

'any()'는 어떤 경우에도 모두 일치하므로 작동하지 않습니다. 나는 여기'eq()'를 시도 할 것이다 :'Matchers.eq (FirstResourceClass.class)'. 이 방법은 인자가 주어진 클래스와 같을 때 매처 (matcher)가 일치한다. –

답변

5

당신은 같이 eq 원하는 :

PowerMockito.when(ResourceFactory.create(Matchers.eq(FirstResourceClass.class))) 
    .thenReturn(mockFirstResource); 

any()이 인수를 무시하고 isA이-하지만 수업이 은 그것이 단지,에게 클래스에 해당하지 않는 것이 당신의 인수가 특정의 것을 확인합니다 instanceof 특정 클래스. 그래서 eq 그 것이다,

isA(Class.class) 당신이 당신의 전화를 차별화하는 데 필요한 것보다 덜 구체적이다 (any(Class)는 Mockito 1.x에서의 any() 의미와 2.x 또는 3.0에서 isA 의미가 있습니다). 어쨌든 클래스 객체는 잘 정의 된 동등성을 가지고 있으므로 사용하기 쉽고 자연 스럽습니다. 이기는하지만 (Mockito의 새 버전이 ArgumentMatchers 대신 매처 (Matchers) 이름을 사용되지 않는 것을

PowerMockito.when(ResourceFactory.create(FirstResourceClass.class)) 
    .thenReturn(mockFirstResource); 

주 및 Mockito.eq 또한 작동합니다 : 당신이 매처 (matcher)를 사용하지 않는 경우 eq가 기본이기 때문에

, 이것은 또한 작동 서투른, 왜냐하면 그들은 "계승"정적 방법).

+0

감사! Matchers.eq()는 제가 찾고 있던 것입니다. – Ajayc