在Junit模型中传递带有添加属性的对象



我试图通过使用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'用户。

确保生产用户和测试用户是相同的实例,或者它们彼此相等

相关内容

  • 没有找到相关文章

最新更新