我试图通过使用MockitoJUnitRunner.class为一个名为generateToken()的方法做mockitto。我试图做的来源如下:
@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()
方法中声明用户对象。当我尝试执行此操作时,从login方法返回的值为空。但是当我尝试将用户对象传递为null时,它将按预期工作。所以问题应该出在user对象上。
有什么,像Mockito
是阻止这种对象添加属性或相关的东西?请帮忙找到一个方法来传递这个用户对象与Mockito。
LoginServiceImpl类如下。
公共类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;
}
}
在用户类上是否有equals/hashcode ?
使用。设置mock的结果是什么Mockito.when (jwtTokenGenerator.generateToken(任何(User.class), (String.class)).thenReturn("myToken");
解释:
当设置期望为
时Mockito.when(jwtTokenGenerator.generateToken(user, jwtSecret)).then...
指示mock只对给定的用户对象执行操作。Equals方法是用来做这个的。如果你的User缺少equals方法,那么就会使用引用相等。两个User对象(分别用单独的new User()
调用创建)将不相等。
对于Mockito.when
中不匹配的参数,不应用模拟(thenReturn
)。默认值(null
)由mock返回。
因此,我更喜欢设置mock而不是特定的参数,然后使用Mockito。验证以检查是否发生了预期的与mock的交互。这样你的测试就更有表现力了。实际上,我的大多数对象都有equals/hashode,不是因为业务原因(我没有把它们放在集合中),而是为了使用assertEquals
进行测试和比较。
注:
do not catch (Exception e) { e.printStackTrace(); }
in test。只需向throw Exception
声明test方法就容易得多。最终结果是相同的(打印stacktrace),但代码更少。
您可能正在生产代码中创建一个新的JwtUserDto(),或者从另一个模拟中获取用户实例。如果你没有覆盖JwtUserDto类中的equals()方法,你的'test'用户将不等于'production'用户。
确保生产用户和测试用户是相同的实例,或者它们彼此相等