java - 有什么方法可以避免此 Mockito 测试的 try/catch block ?

标签 java lambda java-8 mockito

我正在使用 Mockito 来模拟一些对象并测试我的 WebSocket 消息发送器服务。 send 方法接受一个 org.springframework.web.socket.WebSocketSession 和一个消息,并返回一个 CompletableFuture

在传递给 CompletableFuturethenAccept() 方法的 lambda 中,我验证了 session.sendMessage() 方法已经被以期望值调用:

WebSocketSession session = mockWebSocketSession();
TextMessage expectedMessage = new TextMessage("test text message");

sender.sendStringMessage(session, "test text message").thenAccept(nil -> {
    try{ // this is what I am talking about
        verify(session).sendMessage(expectedMessage);
    }catch(IOException e){}
});

由于 sendMessage() 方法抛出一个 IOException,我不得不在 lambda 内部的调用周围添加一个无用的 try/catch block 。这是不必要的冗长。

我该如何避免呢?

最佳答案

您可以尝试使用 Durian library

foodOnPlate.forEach(Errors.suppress().wrap(this::eat));
list.forEach(Errors.rethrow().wrap(c -> somethingThatThrows(c)));

或者自己扩展Cosumer

@FunctionalInterface
public interface ThrowingConsumer<T> extends Consumer<T> {

    @Override
    default void accept(final T elem) {
        try {
            acceptThrows(elem);
        } catch (final Exception e) {
            /* Do whatever here ... */
            System.out.println("handling an exception...");
            throw new RuntimeException(e);
        }
    }

    void acceptThrows(T elem) throws Exception;
}
//and then pass
thenAccept((ThrowingConsumer<String>) aps -> {
  // maybe some other code here...
throw new Exception("asda");
})

关于java - 有什么方法可以避免此 Mockito 测试的 try/catch block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39534069/

相关文章:

java - Maven:编译为可执行 Jar 后找不到资源路径

java - 我应该使用什么数据类型来存储非终止有理数

c++ - 在用作槽的 lambda 函数中捕获的堆栈分配变量的生命周期是多少?

c++11 - std::function 是如何为 lambda 构造的

java - 如何将条件语句与这个特定的 lambda 表达式结合起来?

java - 使用 Google Sheets API v4 追加 100 万行并指定单元格位置

java - 无法使用 Selenium 定位 SmartGWT 应用程序中的元素

c++ - 关于C++中auto关键字类型推导的疑惑

node.js - Kibana - 无法在 Windows 10 上启动 kibana

java-8 - java 8 中的 parallelStream() 是否保证顺序?