mock when 无返回怎么办_Mockito when()。thenReturn()在测试系统中不起作用

博主在测试调用模拟服务的控制器时,发现Mockito的when().thenReturn()规则在测试系统外有效,但在被测试的控制器方法内不生效,loginService.createJwt()返回空值而非预期值,博主给出了控制器方法和测试类代码,询问原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在测试一个调用我想要模拟的服务的控制器。 如果在测试中我控制when().thenReturn()规则的结果,那么它工作正常。

当我调试并检查定义的规则是否在被测试的系统(即我的控制器)中是有效的和应用的时候,那么,规则根本不被应用,它返回一个空值而不是我想要的值。让我们深入我的代码!

在这里有我的控制器的方法,这是在测试系统:

@RequestMapping(value = "/login", method = POST)

public ResponseEntity loginUser(@RequestParam(value ="id") String id, @RequestParam(value="password") String pwd){

try {

Optional userr = loginService.getUserFromDbAndVerifyPassword(id, pwd); //verify the presence into the database

if (userr.isPresent()) {

User user = userr.get();

String jwt = loginService.createJwt(user.getId(), user.getUsername(), user.getPermission(), new Date());

return ResponseEntity.status(HttpStatus.OK).header("jwt", jwt).body(new JsonResponseBody(HttpStatus.OK.value(),"Success! User logged in." + jwt));

}

}catch(UserNotLoggedException e1){

return ResponseEntity.status(HttpStatus.FORBIDDEN).body(new JsonResponseBody(HttpStatus.FORBIDDEN.value(),"Login failed! Wrong credentials. " + e1.toString()));

}catch(UnsupportedEncodingException e2){

return ResponseEntity.status(HttpStatus.FORBIDDEN).body(new JsonResponseBody(HttpStatus.FORBIDDEN.value(),"Login failed! Encoding permission token error. " + e2.toString()));

}

return ResponseEntity.status(HttpStatus.FORBIDDEN).body(new JsonResponseBody(HttpStatus.FORBIDDEN.value(),"Login failed! No corrispondence found into the database of users."));

}

这是我的测试类与测试方法:

@RunWith(MockitoJUnitRunner.class)

public class RestControllerTest {

@InjectMocks

RestController restController;

@Mock

LoginService loginService;

@Test

public void loginUserWithSuccessTest() throws UserNotLoggedException, UnsupportedEncodingException{

User user = new User("BDAGPP32E08F205K", "Pippo Baudo", "ILoveSanRemoEncrypted", "conduttore");

Optional fakeUserOptional = Optional.of(user);

when(loginService.getUserFromDbAndVerifyPassword("BDAGPP32E08F205K","ILoveSanRemo")).thenReturn(fakeUserOptional);

String jwt = "aaaa.bbbb.cccc";

when(loginService.createJwt(user.getId(), user.getUsername(), user.getPermission(), new Date())).thenReturn(jwt);

//I've tested also: when(loginService.createJwt(any(), any(), any(), any())).thenReturn(jwt);

//This is TRUE: assertEquals(loginService.createJwt(user.getId(), user.getUsername(), user.getPermission(), new Date()), jwt); TRUE

//THIS IS THE METHOD BEING TESTED

ResponseEntity serverResponse = restController.loginUser("BDAGPP32E08F205K","ILoveSanRemo");

RestController.JsonResponseBody responseBody = restController.new JsonResponseBody(HttpStatus.OK.value(), "Success! User logged in." + jwt);

assertEquals(serverResponse.getStatusCode(), HttpStatus.OK); //TRUE

assertThat(serverResponse.getBody(), is(responseBody)); //FALSE because jwt is NULL!!!!

}

}

因此,Mockito规则的作品外方法正在测试。 在里面,loginService.createJwt()给了我一个jwt空值,而不是尊重我所期望的值。 这是一个非常奇怪的行为。为什么?谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值