首页 > 解决方案 > 在 Java 的 ifPresent() 中使用 AssertJ 的 assertThat 函数 Optional

问题描述

如何删除 中的 try-catchassertThatifPresent()?编译器只给了我一个使用assertThatin 的选项ifPresent(),那就是用 try-catch 块包围它。也不允许再次抛出异常。

@Test
public void testPostRequestThenSaveResponse()
        throws HttpStatusCodeException, JsonProcessingException, IllegalArgumentException, IOException {
    // Should success.
    try {
        ServiceAssignmentImpl.httpPostDeliveryOrder(url, token, sod, customerSite, customer, item, uom, driver)
                .ifPresent((deliveryOrderResponse) -> {
                    // increase DO number for next test.
                    deliveryOrderNum++;
                    DeliveryOrderResponse savedDOResponse = deliveryOrderResponseRepository
                            .save(deliveryOrderResponse);
                    DeliveryOrderResponse fetchedDOResponse = deliveryOrderResponseRepository
                            .findOne(savedDOResponse.getId());                      
                    try {
                        assertThat(json.write(fetchedDOResponse))
                                .isEqualTo(objectMapper.writeValueAsString(deliveryOrderResponse));
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                });
    } catch (HttpStatusCodeException e) {
        // need getResponseBodyAsString() to see detail error message.
        System.out.println("** HttpStatusCodeException: " + e.getResponseBodyAsString());
        throw e;
    }
}

标签: javaunit-testingexceptionassertj

解决方案


只需使用.get(),如果响应不存在,您的测试不应通过,因此无需使其成为条件。

在没有 MCVE 的情况下,我已经尽可能地调整了您的代码。

    @Test
    public void testPostRequestThenSaveResponse()
            throws HttpStatusCodeException, JsonProcessingException, IllegalArgumentException, IOException {
        // Should success.
        try {
            var = deliveryOrderResponseServiceAssignmentImpl.httpPostDeliveryOrder(url, token, sod, customerSite, customer, item, uom, driver).get()
                   
             // increase DO number for next test.
             deliveryOrderNum++;
             DeliveryOrderResponse savedDOResponse = deliveryOrderResponseRepository
                                .save(deliveryOrderResponse);
             DeliveryOrderResponse fetchedDOResponse = deliveryOrderResponseRepository
                                .findOne(savedDOResponse.getId());  
             assertThat(json.write(fetchedDOResponse))
                                    .isEqualTo(objectMapper.writeValueAsString(deliveryOrderResponse));
                     
        } catch (HttpStatusCodeException e) {
            // need getResponseBodyAsString() to see detail error message.
            System.out.println("** HttpStatusCodeException: " + e.getResponseBodyAsString());
            throw e;
        }
    }

推荐阅读