gpt4 book ai didi

java - Mockito when().thenReturn() 在被测系统中不起作用

转载 作者:行者123 更新时间:2023-11-29 07:28:43 29 4
gpt4 key购买 nike

我已经阅读了此处的所有其他主题,但找不到正确的解决方案。

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

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

这是我的 Controller 方法,它是被测系统:

@RequestMapping(value = "/login", method = POST)
public ResponseEntity<Object> loginUser(@RequestParam(value ="id") String id, @RequestParam(value="password") String pwd){
try {
Optional<User> 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<User> 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 null,而不是尊重我从我给出的规则中期望的值。这是一种非常奇怪的行为。为什么会这样?谢谢!

最佳答案

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

这几乎总是会失败,因为在模拟设置和实际调用时日期会有所不同。

when(loginService.createJwt(any(), any(), any(), any()))

这也是狡猾和含糊的。

我会尝试:

import static org.mockito.ArgumentMatchers.*;

...

when(loginService.createJwt(eq(user.getId()), eq(user.getUsername()), eq(user.getPermission()), any(Date.class))).thenReturn(jwt);

关于java - Mockito when().thenReturn() 在被测系统中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46222231/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com