2016-09-01 18 views
6

Tôi đang cố gắng giả lập một giao diện.Làm thế nào để giả lập một giao diện Java PowerMockito

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

}

Trong mã của tôi, khi tôi gọi phương pháp này findByAppli, tôi muốn trả về một danh sách các FlowCopyParams.

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

đây cố gắng của tôi trong các thử nghiệm lớp:

@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); 
} 

Tôi có lỗi này:

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

Tôi không biết tại sao, vì phương pháp findByAppli phải có hai tham số chuỗi, và tôi đặt Mockito.anyString() và tôi vẫn có IllegalArgumentExcepti trên.

Bất kỳ đầu mối nào?

Thxs.

Trả lời

7

Bạn không cần phải sử dụng PowerMockito, và như mình một giao diện, theres không cần phải do thám() như bạn đang không dựa vào bất kỳ không chế giễu logic.

Có thể thực hiện như thế này, trong lớp thử nghiệm của bạn xác định biến lớp.

private FlowCopyParamsBusinessManager flowCopyParamsBusinessManagerMock; 

Trong một phương pháp @Before chú thích:

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

Sau đó tham khảo flowCopyParamsBusinessManagerMock trong các thử nghiệm của bạn.

+0

Tôi thậm chí không biết gián điệp nào cụ thể. – Kikou

+0

Spy cho phép bạn sử dụng các phần (phương pháp) của việc triển khai bê tông gốc của đối tượng trong khi giả lập sẽ không cung cấp bất kỳ triển khai ban đầu nào. – UserF40

1

thử nghiệm của tôi đã không làm việc vì tôi đã cố gắng để do thám lớp và không phải trên thể hiện của FlowCopyParamsBusinessManager.class.

Đầu tiên, chúng ta phải tạo ra các mô hình:

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

Sau đó, do thám các ví dụ:

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

Nó hoạt động cũng!

+0

Tôi nhận được lỗi này nói rõ ràng rằng giao diện không thể được giả lập .. Làm thế nào là mã trên làm việc? 'Mockito không thể giả mạo lớp này: class org.springframework.security.core.Authentication $$ EnhancerByMockitoWithCGLIB $$ 95622b34 Mockito chỉ có thể giả lập các lớp có thể nhìn thấy và không phải là cuối cùng.' – Dish

0

Tôi đã làm điều này đặt @RunWith này (PowerMockRunner.class) ở phía trên cùng của lớp. sau đó giả lập Object với PowerMockito.mock (MyMock.class); Cách này sử dụng có thể giả lập một giao diện hoặc lớp cuối cùng.

Các vấn đề liên quan