EDIT: Cuối cùng tôi đã tạo một issue về dự án Mockito github.Mockito returnsFirstArg() không làm việc với arg đầu tiên generic
Tôi đang cố gắng để thử phương pháp gõ getNameElement
của Interface RoomGeneralService
để trả lại arg đầu tiên, sử dụng Mockito AdditionalAnswers.returnsFirstArg
chức năng:
Interface để thử:
interface PrimaryKeyElement<T> {
public String getNameElement(T primaryKey);
}
interface RoomGeneralService extends PrimaryKeyElement<String> {
// ...
}
thử nghiệm của tôi (lưu ý hàng nhập khẩu)
import static org.mockito.AdditionalAnswers.returnsFirstArg;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.when;
@RunWith(PowerMockRunner.class)
public class SampleTest {
@Mock
RoomGeneralService roomGeneralService;
@Test
public void testFoo() throws Exception {
when(roomGeneralService.getNameElement(anyString())).thenAnswer(returnsFirstArg());
//...
}
}
Ngoài ra tôi đã thử với các kết hợp khác, nhưng không thành công cho đến nay:
when(roomGeneralService.getNameElement(Matchers.<String>any())).thenAnswer(returnsFirstArg());
doAnswer(returnsFirstArg()).when(roomGeneralService.getNameElement(anyString()));
doReturn(returnsFirstArg()).when(roomGeneralService.getNameElement(anyString()));
Lỗi nhận:
Lý do cho lỗi này có thể là: 1. muốn tranh luận vị trí không đúng. 2. Câu trả lời được sử dụng trên sự tương tác sai.
Vị trí của đối số truy nã là 0 và các chỉ số tham số có thể cho phương pháp này là: [0] Object
Cách giải quyết:
Tôi biết tôi có thể tạo ra câu trả lời của riêng tôi, và trong thực tế nó làm việc tốt nếu thay vì sử dụng returnFirstArg()
tôi làm điều gì đó như thế này:
when(roomGeneralService.getNameElement(anyString())).thenAnswer(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
return (String) invocation.getArguments()[0];
}
});
Nhưng tôi sẽ sử dụng returnFirstArg()
như trong phần còn lại của các bài kiểm tra của tôi (kiểm tra trông sạch hơn), cũng như chế nhạo đang làm việc tốt nếu phương pháp getNameElement
sẽ nhận được String
thay vì T
arg.
Cảm ơn sự giúp đỡ.
Trước hết, cảm ơn bạn đã trả lời. Thật không may việc ghi đè phương thức không phải là một lựa chọn cho dự án. Nếu Mockito không thể làm điều đó, tôi sẽ tiếp tục giải quyết vấn đề này. – troig
@troig Bạn không kiểm soát mã nguồn của các giao diện này? –
Không, đó là vấn đề. Cảm ơn bạn đã tiếp cận của bạn anyway. – troig