Spring 使用Mockito测试可能引发异常的POST服务的正确方法?

Spring 使用Mockito测试可能引发异常的POST服务的正确方法?,spring,unit-testing,spring-mvc,mockito,Spring,Unit Testing,Spring Mvc,Mockito,我有一个用Java编写的简单REST服务(SpringBoot)。其思想是允许用户在实体不存在的情况下添加新实体。如果它确实存在,我将抛出一个异常 以下是代码: public ResponseEntity<String> addReadings(int clientId, int year, int month, double additionalConsumption) throws NoSuchMessageException, IllegalModificationEx

我有一个用Java编写的简单REST服务(SpringBoot)。其思想是允许用户在实体不存在的情况下添加新实体。如果它确实存在,我将抛出一个异常

以下是代码:

    public ResponseEntity<String> addReadings(int clientId, int year, int month, double additionalConsumption) throws NoSuchMessageException, IllegalModificationException{     
    
    Optional<Client> clientOptional = clientService.findByClientId(clientId);

    if (clientOptional.isEmpty()) {
        return ResponseEntity.status(HttpStatus.NO_CONTENT)
                             .header("message", messageSource.getMessage("client.error1", null, new Locale("EN")))
                             .build(); 
    }
    
    Optional<Reading> reading = readingService.findByClientAndYearAndMonth(clientOptional.get(), year, month);
    
    if (reading.isPresent()) throw new IllegalModificationException(messageSource.getMessage("consumption.error2", null, new Locale("EN")));
            
    readingService.save(Reading.builder()
                                .client(clientOptional.get())
                                .year(year)
                                .month(month)
                                .consumption(additionalConsumption)
                                .build());
    

    return ResponseEntity
            .status(HttpStatus.OK)
            .body(messageSource.getMessage("sucess", null, new Locale("EN")));
}
public ResponseEntity addReaders(int clientId、int year、int month、double additionalConsumption)抛出NoSuchMessageException、IllegalModificationException{
可选clientOptional=clientService.findByClientId(clientId);
if(clientOptional.isEmpty()){
返回ResponseEntity.status(HttpStatus.NO_内容)
.header(“message”,messageSource.getMessage(“client.error1”,null,新语言环境(“EN”))
.build();
}
可选读取=readingService.findByClientAndYearAndMonth(clientOptional.get(),year,month);
if(reading.isPresent())抛出新的非法修改异常(messageSource.getMessage(“consumption.error2”,null,新区域设置(“EN”));
readingService.save(Reading.builder())
.client(clientOptional.get())
.年(年)
.月(月)
.消耗量(额外消耗量)
.build());
返回响应性
.status(HttpStatus.OK)
.body(messageSource.getMessage(“success”,null,新区域设置(“EN”));
}

问题是如何在Spring框架中使用Mockito以最简单、最干净的方式测试异常的抛出?

Mock
readingService
,以便
readingService.findByClientAndYearAndMonth
返回表示某个值的可选值,即
reading.isPresent()
is
is
true

比如:

客户端=。。。
ReadingServiceClass readingService=Mockito.mock(ReadingServiceClass.class);
莫基托
.when(readingService.findByClientAndYearAndMonth(客户端,2020年10月))
.然后返回(可选)(新读数(…));
// ... 将readingService注入objectToTest
试一试{
objectToTest.AddReaders(1,2020,10,1.0d);
Assert.fail();
}(捕获非法修改例外情况e){
//…断言异常的详细信息
}

你能告诉我导入Assert.fail()的包名是什么吗