Java 使用mockito的Spring MVC模拟不在服务层上发生

Java 使用mockito的Spring MVC模拟不在服务层上发生,java,spring-boot,spring-mvc,mockito,junit5,Java,Spring Boot,Spring Mvc,Mockito,Junit5,这是我的控制器: @RestController 公共类贷款控制员{ @自动连线 私人贷款服务贷款服务; @GetMapping(“/loans/{id}”) 公共贷款getLoan(@PathVariable Long id){ 返回loanService.getLoan(id); } @邮购(“/贷款”) 公共响应addLoan(@RequestBody Loan){ System.out.println(“测试2>>”+贷款服务isLoanProcessed(贷款)); if(贷款

这是我的控制器:


@RestController
公共类贷款控制员{
@自动连线
私人贷款服务贷款服务;
@GetMapping(“/loans/{id}”)
公共贷款getLoan(@PathVariable Long id){
返回loanService.getLoan(id);
}   
@邮购(“/贷款”)
公共响应addLoan(@RequestBody Loan){
System.out.println(“测试2>>”+贷款服务isLoanProcessed(贷款));
if(贷款服务isLoanProcessed(贷款)){
return ResponseEntity.status(HttpStatus.CREATED.build();//返回http 201返回代码
}
return ResponseEntity.status(HttpStatus.CONFLICT).build();//返回http 409返回代码
}   
}
服务:

@服务
公共类贷款服务{
@自动连线
私人贷款;储蓄性贷款;
公共布尔ISLOANPROCESS(贷款){
//确认贷款
如果(有效(贷款)){
//拿到贷款费
Double loanFees=getLoanFees(loan.getLoanType().trim());
//获得贷款总利息
Double-totLoanInterest=calcloantalintest(loan.getLoanAmt(),loan.getRate(),loan.getloainterm());
//获取APR
Double apr=getAPR(totLoanInterest,loanFees,loan.getLoanAmt(),loan.getloainterm());
//将计算APR设置为贷款模型
贷款。设定4月(4月);
//将贷款添加到db
这是一笔贷款;
返回true;
}否则{
//如果贷款无效,抛出自定义异常
//仍然需要实施
返回false;
}
}
下面是TestClass:

@SpringBootTest
@AutoConfigureMockMvc
公共类贷款控制集成测试{
@自动连线
私有MockMvc-MockMvc;
@蚕豆
私人贷款服务模拟贷款服务;
私人自动关闭;
@注射模拟
贷款控制员贷款控制员;
私人贷款;
私有SimpleDataFormat sdf=新SimpleDataFormat(“MM/dd/yyyy”);
@之前
public void init()引发异常{
closeable=MockitoAnnotations.openMocks(此);
mockMvc=MockMvcBuilders.standaloneSetup(loanController.build();
}
@试验
@DisplayName(“过账/贷款”)
最终void addLoanIdTest()引发异常{
贷款设定年利率(双倍价值(5.15));
贷款。设定贷款状态(“A”);
当(mockLoanService.isLoanProcessed(loan)),然后返回(true);
System.out.println(“测试1>”+mockLoanService.isLoanProcessed(loan));//打印为真
mockMvc.perform(post(“/loans”)
.contentType(MediaType.APPLICATION_JSON)
.content(convertObjToJsonString(贷款)))
.andExpect(status().isOk());
}  
我的问题是:
在测试中,当我在
mockLoanService.isLoanProcessed(loan)
上打印时,模拟发生正确,这是正确的,但在控制器中,post方法修改后的模拟数据没有拾取,当我打印时显示为
false
,控制器上的条件检查
if(loanService.isLoanProcessed(loan))
使用模拟数据时未发生。请在我出错的地方提供您的输入。

在您的before方法中,尝试添加:

MockitoAnnotations.initMocks(this);

它不起作用,因为您正在将模拟绑定到在
LoanControllerIntegrationTests
类中创建的特定
Loan
对象。在controller中创建的对象不是同一个对象

简单的例子:

要解决您的问题,请使用
any()
运算符:

when(mockLoanService.isLoanProcessed(any(Loan.class))).thenReturn(true);
可从以下导入语句中获取:
导入static org.mockito.ArgumentMatchers.any;

由于断言失败,您认为它不起作用吗?您正在返回控制器中创建的HTTP状态,但在测试中验证HTTP staus ok。我希望控制器loanService.isLoanProcessed(loan)中的模拟服务;控制器需要求值为true,以便控制器执行返回ResponseEntity.status(HttpStatus.CREATED.build();并返回201。如果需要更多信息,请告诉我。添加的init()方法closeable=MockitoAnnotations.openMocks(此);我认为这将初始化模拟。谢谢,它解决了我的问题。然后我的下一个问题是如何获取控制器生成的贷款对象。我假设您要检查控制器响应。要访问响应json,请使用
jsonPath
,示例:
.andExpect(jsonPath($.loanValue”).value(123.456f))