2016-09-01 4 views
6

인터페이스를 모의하려고합니다.인터페이스 모의 방법 Java PowerMockito

public interface FlowCopyParamsBusinessManager { 
List<FlowCopyParams> findByAppli(String application, String sourcePattern) 
     throws FlowCopyParamsBusinessException; 

} 내 코드에서

, 내가 findByAppli이 방법 를 호출 할 때, 나는 FlowCopyParams의 목록을 반환하고 싶습니다. 여기

List<FlowCopyParams> lstFlowCopyParams = flowCopyParamsBusinessManager.findByAppli(
        "TOTO","TATA); 

클래스 테스트 내 시도 :

@BeforeClass 
public static void mockBeanIn() throws Exception { 
List<FlowCopyParams> flowCopyParamsList = new ArrayList<>(); 

PowerMockito.spy(FlowCopyParamsBusinessManager.class); 
PowerMockito.when(FlowCopyParamsBusinessManager.class, "findByAppli", Mockito.anyString(), Mockito.anyString()).thenReturn(flowCopyParamsList); 
} 

이 오류가 있습니다

java.lang.IllegalArgumentException: object is not an instance of declaring class 

나도 몰라 왜 방법 findByAppli은 는 두 개의 문자열 매개 변수를 가지고 있어야하기 때문에, 나는 넣어 Mockito.anyString() 그리고 난 여전히 을 가지고있다 IllegalArgumentExcepti에 있습니다.

단서가 있습니까?

Thxs.

답변

7

PowerMockito를 사용할 필요가 없으며 해당 인터페이스로 비 조롱 된 논리에 의존하지 않으므로 spy()를 수행 할 필요가 없습니다.

이렇게하면 테스트 클래스에서 클래스 변수를 정의 할 수 있습니다. @Before 주석 방법에

private FlowCopyParamsBusinessManager flowCopyParamsBusinessManagerMock; 

:

flowCopyParamsBusinessManagerMock = Mockito.mock(FlowCopyParamsBusinessManager.class); 
List<FlowCopyParams> flowCopyParamsList = new ArrayList<>(); 
when(flowCopyParamsBusinessManagerMock 
.findByAppli(Mockito.anyString(), Mockito.anyString()).thenReturn(flowCopyParamsList); 

이 그런 다음 테스트에서 flowCopyParamsBusinessManagerMock을 참조하십시오.

+0

구체적으로 스파이가 무엇인지 모르겠다. – Kikou

+0

Spy를 사용하면 객체의 원본 구현의 일부 (메소드)를 사용할 수 있지만 모의에서는 원래 구현을 제공하지 않습니다. – UserF40

1

클래스를 스파이하려고하고 FlowCopyParamsBusinessManager.class의 인스턴스가 아니기 때문에 테스트가 작동하지 않았습니다.

첫째, 우리는 모형을 만들어야합니다 :

FlowCopyParamsBusinessManager mockFlowCopyParamsBusinessManager = PowerMockito.mock(FlowCopyParamsBusinessManager.class); 

그런 다음, 인스턴스를 스파이 :

PowerMockito.spy(mockFlowCopyParamsBusinessManager); 
PowerMockito.when(mockFlowCopyParamsBusinessManager, "findByAppli", Mockito.anyString(), Mockito.anyString()).thenReturn(flowCopyParamsList); 

그것은뿐만 아니라 작동합니다!

+0

인터페이스를 조롱 할 수 없다는 오류가 분명하게 나타납니다. 위 코드는 어떻게 작동합니까? 'Mockito는이 클래스를 모의 할 수 없습니다 : class org.springframework.security.core.Authentication $$ EnhancerByMockitoWithCGLIB $$ 95622b34 모키토는 가시 클래스와 비 최종 클래스만을 모의 할 수 있습니다 .' – Dish

0

나는 이것을 @RunWith (PowerMockRunner.class)를 클래스 상단에 넣었다. 그런 다음 PowerMockito.mock (MyMock.class)을 사용하여 Object를 모의 해보십시오. 이 방법을 사용하면 인터페이스 또는 최종 클래스를 조롱 할 수 있습니다.