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

时间:2016-11-03 10:09:53

标签: junit mockito

我尝试使用 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;
}

}

2 个答案:

答案 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(); }声明测试方法要容易得多。最终结果是相同的(堆栈跟踪打印)但代码较少。