2013-08-05 54 views
6

Một trong những phương pháp tĩnh tôi đang sử dụng, nó có hai điều. Nó trả về một số dữ liệu, nhưng nó cũng sửa đổi đối tượng đối số được truyền cho nó. Đối tượng đối số được cập nhật này sau đó được sử dụng sau trong mã.doAnswer cho các phương pháp tĩnh - PowerMock

Tôi đang sử dụng PowerMock để giả lập hành vi trả lại.

Để xác định phần thứ hai - cập nhật đối số đầu vào, tôi định nghĩa phương thức doAnswer nhưng nó không hoạt động. Phương pháp mà tôi đang cố gắng kiểm tra trông như thế này.

public void login() throws ConnectionException, AsyncApiException { 
    ConnectorConfig partnerConfig = new ConnectorConfig(); 

    //This call sets the value in one member variable 'serviceEndPoint in ParterConfig which is accessed later in this method only. 
    partnerConnection = Connector.newConnection(partnerConfig); 

    //partnerConfig.getServiceEndpoint is called. 

    PowerMockito.mockStatic(Connector.class); 
    when(Connector.newConnection(Mockito.any(ConnectorConfig.class))).thenReturn(partnerConnection); 

    PowerMockito.doAnswer(new Answer<Void>() { 
     @Override 
     public Void answer(InvocationOnMock invocation) { 
      ConnectorConfig config = (ConnectorConfig) invocation.getArguments()[0]; 
      config.setServiceEndpoint("service end point"); 
      return null; 
     } 
    }).when(Connector.newConnection(Mockito.any(ConnectorConfig.class))); 
}  

nhưng ở trên ném lỗi có nội dung 'Phát hiện chưa hoàn thành được phát hiện tại đây'. Connector là lớp của bên thứ ba nên tôi không có quyền kiểm soát hành vi của mình.

Bất kỳ đề xuất nào, điều gì có thể xảy ra?

Trả lời

11
PowerMockito.doAnswer(new Answer<Void>() { 
    /* ... */ 
}).when(Connector.newConnection(Mockito.any(ConnectorConfig.class))); 

when của bạn là vấn đề. Trong Mockito bình thường, sử dụng bất kỳ doAnswer/doReturn/etc cuộc gọi, bạn phải đặt cuộc gọi bạn đang stubbing ngoài của cuộc gọi để when, như vậy:

Mockito.doAnswer(new Answer<Void>() { 
    /* ... */ 
}).when(yourMock).callVoidMethod(); 
//   ^^^^^^ 

PowerMockito tiếp tục đòi hỏi các cuộc gọi đến các phương pháp tĩnh xảy ra in the next statement, như vậy:

PowerMockito.doAnswer(new Answer<Void>() { 
    /* ... */ 
}).when(Connector.class); Connector.newConnection(/*...*/); 
//     ^^^^^^ 

Lưu ý rằng documentation I linked thực sự là không phù hợp - trông giống như các tài liệu ám chỉ đến một zero-arg when, trong khi lớp nghĩa đen là cần thiết trong chữ ký avail có thể. Đó có thể là một điều tốt để gắn cờ là một lỗi, nếu bạn có một chút thời gian.

Bắt buộc PSA: Nói chung, ý tưởng hay là avoid mocking types you don't own, mặc dù là jury's still out on that one.

+0

thnx cho liên kết doc. Tôi sẽ thử vào ngày mai. – RandomQuestion

+0

Điều này đã hiệu quả. Tôi đã đệ trình một lỗi. Chủ đề không phải là điểm nhưng tôi dường như không thể chỉnh sửa nó. https://code.google.com/p/powermock/issues/detail?id=452&can=4&q=javadoc – RandomQuestion