Tôi cố gắng để viết một bài kiểm tra đơn vị cho việc này:Làm cách nào để tôi có thể tạo tài nguyên có thể đóng tự động đúng cách?
try (final DatagramChannel channel = helper.createChannel()) {
...
}
Trong thử nghiệm của tôi, tôi nhạo báng các helper (sử dụng Mockito), và nói với helper.createChannel() để trả về một kênh chế giễu.
thử nghiệm này không thành công với
java.lang.NullPointerException
at java.nio.channels.spi.AbstractInterruptibleChannel.close(AbstractInterruptibleChannel.java:111)
Tôi hiểu rằng các thiết bị thử-với-các nguồn lực trong Java gọi phương thức close() trong DatagramChannel lúc đi ra khỏi khối try, nhưng không nên đóng cửa() phương pháp trong DatagramChannel giả được gọi khi?
Trình gỡ lỗi cho tôi biết rằng khóa closeLock trong AbstractInterruptibleChannel là rỗng.
Tôi có nên phân lớp DatagramChannel, ghi đè lên phương thức close() trong đó và sau đó giả lập lớp con của tôi thay thế không? Hoặc, tôi đang làm điều gì đó sai trái một cách sâu sắc hơn (mô hình trợ giúp trả về một mô hình)?
Kính trọng, Fredrik Israelsson
mã kiểm tra, theo yêu cầu:
@Mock
private InetAddress peerAddress;
@Mock
private UDPChannelHelper helper;
@Mock
private DatagramChannel channel;
private UDPTransportImpl transport;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(helper.createChannel()).thenReturn(channel);
transport = new UDPTransportImpl(peerAddress, 0, helper);
}
@Test
public void testNormalSubmit() throws Exception {
transport.submit("Hello");
}
Như bạn thấy, tôi không chỉ định bất kỳ hành vi cho channel.close(). Tôi tin rằng tôi không cần phải, bởi vì close() trả về void.
Bạn có thể hiển thị mã của mình ở nơi bạn đang chế nhạo những mã này không? Bạn cũng đã sửa lỗi và xác nhận rằng helper a) thực sự là một giả lập, b) helper.createChannel() cũng trả về một đối tượng giả lập? – cowls
Đã thêm mã kiểm tra và có, trong trình gỡ lỗi, cả trình trợ giúp và kênh đều thuộc loại BlaBlaBla $$ EnhancerByMockitoWithCGLIB. –
Trang này: http://mockito.googlecode.com/svn/tags/latest/javadoc/org/mockito/Mockito.html#doNothing%28%29 tuyên bố rõ ràng rằng "các phương pháp void trên mocks không làm gì theo mặc định!". Vì vậy, chúng tôi chỉ có thể giả định rằng khối cuối cùng không thực hiện trên mô hình. Mã của bạn có vẻ tốt với tôi mặc dù vậy Im không chắc chắn lý do tại sao đó là .. bạn chắc chắn không cần phải phân lớp nó cho mình mặc dù. – cowls