gpt4 book ai didi

junit - 在 Junit Mockito 中传递具有添加属性的对象

转载 作者:行者123 更新时间:2023-12-05 07:46:56 25 4
gpt4 key购买 nike

我正在尝试使用 MockitoJUnitRunner.class 为名为 generateToken() 的方法执行 Mockito。我尝试做的来源如下。

@RunWith(MockitoJUnitRunner.class)
public class LoginServiceTest {

@Mock
private UserRepository userRepository;

@Mock
private JwtTokenGenerator jwtTokenGenerator;

@InjectMocks
private LoginServiceImpl loginServiceImpl = new LoginServiceImpl();

private JwtUserDto user;

private String jwtSecret;
private String username;
private String password;

/**
* Initialize test data before test cases execution
*/
@Before
public void init() {

user = new JwtUserDto();
user.setId(1L);
user.setUsername("kray1");
user.setRole("Admin");

}

@Test
public void testLogin() {

try {

Mockito.when(jwtTokenGenerator.generateToken(user, jwtSecret)).thenReturn("myToken");

String actual = loginServiceImpl.login(username, password);
assertNotNull(actual);

} catch (Exception e) {
e.printStackTrace();
}

}

对于 generateToken() 方法,我必须传递用户对象和一个字符串。我在 Init() 方法中声明用户对象。当我尝试执行此操作时,登录方法返回的值为空。但是当我尝试将用户对象作为 null 传递时,它将按预期工作。所以问题应该出在用户对象上。

有什么东西,比如 Mockito 正在阻止这种带有添加属性或相关事物的对象吗?请帮助找到一种使用 Mockito 传递此用户对象的方法。

LoginServiceImpl类如下。

公共(public)类 LoginServiceImpl 实现 LoginInterface {

@Autowired
private UserRepository userRepository;

@Autowired
private JwtTokenGenerator jwtTokenGenerator;


/*
* (non-Javadoc)
*/
public String login(String userName, String password) {

if (userName != null && password != null && !userName.isEmpty() && !password.isEmpty()) {
List<UserAuthenticationInfo> authInfo = userRepository.findUserRolesByUsernamePassword(userName, password);
if (authInfo != null && !authInfo.isEmpty()) {
JwtUserDto user = new JwtUserDto();
user.setId((long) authInfo.get(0).getUserId());
user.setUsername(userName);
user.setRole(authInfo.get(0).getUserRole());

return jwtTokenGenerator.generateToken(user, jwtSecret);

}
}

return null;
}

最佳答案

你在 User 类上有 equals/hashcode 吗?

如果你设置模拟使用,结果是什么 Mockito.when(jwtTokenGenerator.generateToken(任何(User.class),任何(String.class)) .thenReturn("myToken");

解释:

当设置期望为

Mockito.when(jwtTokenGenerator.generateToken(user, jwtSecret)).then...

您指示您的模拟给定用户对象。 equals 方法用于此。因此,如果您的 User 缺少 equals 方法,则会使用引用相等性。两个 User 对象(每个都使用单独的 new User() 调用创建)将相等。

对于 Mockito.when 中的不匹配参数,您的模拟 (thenReturn) 不会被应用。模拟返回默认值(null)。

因此,我更喜欢不为特定参数设置模拟,然后使用 Mockito.verify 检查是否发生了与模拟的预期交互。这样你的测试更具表现力。实际上,我的大部分对象都具有 equals/hashode 并不是因为业务原因(我没有将它们放在集合中),而是仅用于使用 assertEquals 进行测试和比较。

旁注:

不要 catch (Exception e) { e.printStackTrace(); } 在测试中。将测试方法声明为 throw Exception 要容易得多。最终结果相同(打印堆栈跟踪)但代码更少。

关于junit - 在 Junit Mockito 中传递具有添加属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40398793/

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