Tôi có một phương thức không đồng bộ mà tôi đang chuyển sang phương thức đồng bộ hóa bằng cách sử dụng chốt đếm ngược. Tôi đang đấu tranh với việc viết một bài kiểm tra đơn vị mà không cần sử dụng chức năng hết thời gian của mockito. Tôi không thể tìm ra phương pháp xác minh để chờ cuộc gọi phương thức không đồng bộ:Mockito với Java async-> công cụ đồng bộ hóa
public interface SyncExchangeService {
boolean placeOrder(Order order);
}
public interface ExchangeService {
void placeOrder(Order order, OrderCallback orderResponseCallback);
}
public interface OrderCallback {
public void onSuccess();
public void onFailure();
}
public class SyncExchangeServiceAdapter implements SyncExchangeService {
private ExchangeService exchangeService;
public SyncExchangeServiceAdapter(ExchangeService exchangeService) {
this.exchangeService = exchangeService;
}
@Override
public boolean placeOrder(Order order) {
final CountDownLatch countdownLatch=new CountDownLatch(1);
final AtomicBoolean result=new AtomicBoolean();
exchangeService.placeOrder(order, new OrderCallback() {
@Override
public void onSuccess() {
result.set(true);
countdownLatch.countDown();
}
@Override
public void onFailure(String rejectReason) {
result.set(false);
countdownLatch.countDown();
}
});
try {
countdownLatch.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return result.get();
}
}
public class SyncExchangeServiceAdapterTest {
private ExchangeService mockExchange=mock(ExchangeService.class);
private SyncExchangeServiceAdapter adapter=new SyncExchangeServiceAdapter(mockExchange);
private Boolean response;
private ArgumentCaptor<Boolean> callback=CaptorArgumentCaptor.forClass(OrderCallback.class);
private CountDownLatch latch=new CountDownLatch(1);
@Test
public void testPlaceOrderWithSuccess() throws Exception {
final Order order=mock(Order.class);
Executors.newSingleThreadExecutor().submit(new Runnable() {
@Override
public void run() {
response=adapter.placeOrder(order);
latch.countDown();
}
});
verify(mockExchange,timeout(10)).placeOrder(eq(order), callbackCaptor.capture());
//the timeout method is not really recommended and could also fail randomly if the thread takes more than 10ms
callbackCaptor.getValue().onSuccess();
latch.await(1000,TimeUnit.MILLISECONDS);
assertEquals(true,response);
}
}
+1 cho sự chờ đợi. Tôi chưa bao giờ nghe về nó, nhưng có vẻ khá hữu ích. – jhericks