如何使用 mockito 为以下异常处理程序方法编写单元测试?

     2023-02-27     240

关键词:

【中文标题】如何使用 mockito 为以下异常处理程序方法编写单元测试?【英文标题】:How to write Unit Test for below Exception Handler method using mockito? 【发布时间】:2019-12-16 05:21:47 【问题描述】:
@ExceptionHandler( ConstraintViolationException.class )
public ResponseEntity<Object> handleConstraintViolation(ConstraintViolationException ex, WebRequest request) 
    StringBuilder messageBuilder = new StringBuilder("Validation failed for: ");
    ex.getConstraintViolations()
        .stream()
        .forEach(v -> messageBuilder
            .append("property: [" + v.getPropertyPath() + "], value: [" + v.getInvalidValue() + "], constraint: [" + v.getMessage() + "]"));
    return new ResponseEntity<>(responseBuilder
        .createErrorResponse(INVALID_PARAMETER,
            messageBuilder.toString()), getHeaders(), BAD_REQUEST);

我想测试这个@ControllerAdvice 方法

【问题讨论】:

你只是想测试这个方法还是想测试这个 ExceptionHandler 是否按预期使用? 只是想测试这个异常处理程序是否按预期工作 【参考方案1】:

如果您只想测试该方法,只需创建ConstraintViolationException 的实例(您的输入)并检查应用于它的handleConstraintViolation 方法的输出即可。 你可以这样做:

ContraintViolationException exception = mock(ContraintViolationException.class);
WebRequest webRequest = mock(WebRequest.class); 
YourControllerAdvice controllerAdvice = new YourControllerAdvice();
Set<ConstraintViolation<?>> violations = new HashSet<>();
ConstraintViolation mockedViolation = mock(ConstraintViolation.class);
given(mockedViolation.getPropertyPath()).willReturn("something");
// mock answer to other properties of mockedViolations 
...
violations.add(mockedViolation);  
given(exception.getContraintViolations()).willReturn(violations);

ResponseEntity<Object> response = controllerAdvice.handleContraintViolation(exception, webRequest);

assertThat(response.getStatusCode(), is(HttpStatus.BAD_REQUEST));

加上响应正文上的其他断言。 然而,很难知道 spring 抛出的所有不同的 ConstraintViolationException 实例可能是什么样子。

我建议您查看 MockMvc,它是 spring-boot-starter-test 的一部分。通过这种方式,您可以测试异常处理程序是否按预期使用,并且您可以验证 ResponseEntity 是否违反约束。

@WebMvcTest(YourController.class)
public class YourControllerMvcTest 

  @Autowired
  private MockMvc mvc;

  @Test
  public void constraintViolationReturnsBadRequest() throws Exception 
    // Instantiate the DTO that YourController takes in the POST request
    // with an appropriate contraint violation
    InputDto invalidInputDto = new InputDto("bad data");
    MvcResult result = mvc.perform(post("/yourcontrollerurl")
            .content(invalidInputDto)
            .contentType(MediaType.APPLICATION_JSON)
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isBadRequest());

    // assert that the error message is as expected
    assertThat(result.getResponse().getContentAsString(), containsString("default message [must match"));
   

MockMvc 也有很好的 json 支持,因此可以添加:

.andExpect(MockMvcResultMatchers.jsonPath("$.field").value("expected value"))

而不是将响应验证为字符串。

【讨论】:

感谢您的努力,但我正在使用 Mockito 框架来测试此方法 查看更新后的答案。我仍然推荐 MockMvc,因为它与 Spring Boot 捆绑在一起。那么你就不需要 mockito 来进行这些测试了。

如何断言使用 mockito 调用方法

】如何断言使用mockito调用方法【英文标题】:Howtoassertthatmethodsarecalledwithmockito【发布时间】:2015-10-1222:28:49【问题描述】:我想问更多与测试相关的概念性问题。我正在使用Mockitos进行单元测试。我有一个方法可以做很多事情。... 查看详情

如何使用 mockito 为以下代码编写 junit 测试?

】如何使用mockito为以下代码编写junit测试?【英文标题】:Howtowritejunittestforbelowcodeusingmockito?【发布时间】:2019-05-2407:44:21【问题描述】:您好,我是使用mockito进行groovy单元测试的新手。我想弄清楚如何在不真正更新或插入数据... 查看详情

使用 Mockito 从模拟中抛出已检查的异常

】使用Mockito从模拟中抛出已检查的异常【英文标题】:throwcheckedExceptionsfrommockswithMockito【发布时间】:2011-04-1507:00:48【问题描述】:我试图让我的一个模拟对象在调用特定方法时抛出一个检查异常。我正在尝试以下方法。@Test(ex... 查看详情

Mockito & Junit 空指针异常:名称不能为空

】Mockito&Junit空指针异常:名称不能为空【英文标题】:Mockito&Junitnullpointerexception:namemustnotbenull【发布时间】:2013-03-1117:38:00【问题描述】:我一直在尝试使用mockito和junit运行以下测试,但我不断收到“java.lang.NullPointerExcept... 查看详情

如何使用junit和mockito为私有void方法编写测试用例[重复]

】如何使用junit和mockito为私有void方法编写测试用例[重复]【英文标题】:Howtowritetestcasesforprivatevoidmethodsusingjunitandmockito[duplicate]【发布时间】:2017-09-0213:26:29【问题描述】:我们可以为setAddr()方法编写测试用例,因为它是私有的v... 查看详情

使用 mockito 测试周围的 try catch 方法

】使用mockito测试周围的trycatch方法【英文标题】:Testingsurroundingtrycatchmethodwithmockito【发布时间】:2021-05-0212:50:46【问题描述】:我想知道如何测试此方法并强制异常“DataAccessResourceFailureException”,但我没有有效的方法。我需要... 查看详情

如何使用 mockito 模拟方法?

】如何使用mockito模拟方法?【英文标题】:Howtomockmethodsusingmockito?【发布时间】:2020-12-0814:10:53【问题描述】:我有一个抽象类和一个派生类。派生类是一个服务,因此会自动装配到测试类中。我需要模拟和测试抽象类中有一个... 查看详情

使用 Mockito 的 FutureBuilder 快照数据为空 - Flutter

】使用Mockito的FutureBuilder快照数据为空-Flutter【英文标题】:FutureBuilderSnapshotDataisnullwithMockito-Flutter【发布时间】:2021-12-2603:58:04【问题描述】:我正在为我的颤振应用程序构建一些测试,并且我发现它在调用API的方法返回数据之... 查看详情

如何使用 Mockito 测试我的 DAO 方法?

】如何使用Mockito测试我的DAO方法?【英文标题】:HowtotestmyDAOmethodsusingMockito?【发布时间】:2018-11-1417:13:45【问题描述】:我正在尝试为我的DAO编写一些测试。我在这里遵循了一些教程/答案,但其中大多数不适用于我的DAO。示例... 查看详情

Mockito 测试 void 方法抛出异常

】Mockito测试void方法抛出异常【英文标题】:Mockitotestavoidmethodthrowsanexception【发布时间】:2013-02-1521:39:39【问题描述】:我有一个返回类型为void的方法。它也可以抛出一些异常,所以我想测试那些抛出的异常。所有尝试都以相同... 查看详情

如何使用 armcc 为 ARM Cortex M3 创建没有硬件异常处理程序的映像

】如何使用armcc为ARMCortexM3创建没有硬件异常处理程序的映像【英文标题】:HowtocreateanImageWithoutHWExceptionHandlersforARMCortexM3usingarmcc【发布时间】:2016-11-0418:11:43【问题描述】:基本上,我需要为ARMCortexM3创建一个可以称为我的简单... 查看详情

BackgroundWorker 异常处理

...ndling【发布时间】:2012-05-0504:28:12【问题描述】:我正在使用以下组件:一个库(引发异常)一个测试控制台来测试我的日志记录企业库异常处理应用程序块企业库日志记录应用程序块我正在使用后台工作程序调用库方法。库引... 查看详情

Mockito 如何模拟和断言抛出的异常?

】Mockito如何模拟和断言抛出的异常?【英文标题】:MockitoHowtomockandassertathrownexception?【发布时间】:2013-04-2101:11:06【问题描述】:我在junit测试中使用了mockito。你如何让异常发生然后断言它有(通用伪代码)【问题讨论】:【... 查看详情

java异常如何解决

在Java应用程序中,异常处理机制为:抛出异常,捕捉异常。抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责... 查看详情

使用 mockito doThrow 测试 catch 块会立即执行

】使用mockitodoThrow测试catch块会立即执行【英文标题】:TestingcatchblockwithmockitodoThrowisexecutedimmediately【发布时间】:2022-01-2318:30:00【问题描述】:我想使用mockito测试我的方法的catch块。如以下示例所示,我在希望发生异常的地方使... 查看详情

如何使用 Mockito 模拟受保护的方法?

】如何使用Mockito模拟受保护的方法?【英文标题】:HowdoIuseMockitotomockaprotectedmethod?【发布时间】:2016-03-0915:26:43【问题描述】:我使用的是Mockito1.9.5。如何模拟从受保护方法返回的内容?我有这个受保护的方法……protectedJSONObje... 查看详情

如何配置多个异常处理程序

】如何配置多个异常处理程序【英文标题】:Howtoconfiguremultipleexceptionhandlers【发布时间】:2019-06-1902:14:45【问题描述】:我正在尝试将我的中间件管道配置为使用2个不同的异常处理程序来处理相同的异常。例如,我试图让我的... 查看详情

cryptographicexception异常处理方法

...raphy.ProtectedData.Protect方法来保护私密信息时,IIS可能会报以下错误:CryptographicException:数据保护操作未成功。这可能是由于未为当前线程的用户上下文加载用户配置文件导致的。当线程执行模拟时,可能会出现此情况。解决方法... 查看详情