我尝试使用 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()
方法中声明了用户对象。当我尝试执行此操作时,login方法返回的值为null。但是当我尝试将用户对象作为 null 传递时,它将按预期工作。所以问题应该在于用户对象。
是否有任何内容,例如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;
}
}
答案 0 :(得分:0)
您可能正在生产代码中创建新的JwtUserDto()或从另一个模拟中获取用户实例。如果你没有覆盖JwtUserDto类中的equals()方法,那么'test'用户将不会等同于'production'用户。
确保生产和测试用户是相同的实例,或者他们彼此相等。
答案 1 :(得分:0)
你在User类上有equals / hashcode吗?
如果使用设置模拟,结果是什么? Mockito.when(jwtTokenGenerator.generateToken(任何(User.class),任(String.class)) .thenReturn( “设为MyToken”);
说明:
将期望设为
$ php Client.php
您指示您的模拟器对给定的用户对象执行 。 equals方法用于此。因此,如果您的用户缺少equals方法,则使用引用相等性。两个用户对象(每个对象都有单独的Mockito.when(jwtTokenGenerator.generateToken(user, jwtSecret)).then...
来电,不相等。
对于new User()
中的非匹配参数,您的模拟(Mockito.when
)未应用。从mock返回默认值(thenReturn
)。
因此,我更喜欢为特定参数设置模拟,然后使用Mockito.verify检查是否发生了与模拟的预期交互。这样你的测试就更具表现力。实际上我的大多数对象都有equals / hashode,这不是出于商业原因(我没有把它们放在集合中),而是仅用于使用null
进行测试和比较。
旁注:
在测试中不要assertEquals
。向catch (Exception e) { e.printStackTrace(); }
声明测试方法要容易得多。最终结果是相同的(堆栈跟踪打印)但代码较少。