如何配置 MyBatisGenerator 生成的 mapper.insertSelective(record) 方法的行为。使用 JUnit4 和 Mockito?

How to configure behaviour of mapper.insertSelective(record) method generated by MyBatisGenerator. using JUnit4 and Mockito?

在我的WebApp中,我使用了MyBatisGenerator来生成mapper接口。我有一个 class UserService 如下:

public class UserService {

    @Autowired
    UserMapper userMapper;

    public int create(UserParams userParams) {

        User user = new User();
        user.setFirstName(userParams.getFirstName());
        user.setLastName(userParams.getLastName());
        user.setUserName(userParams.getUserName());
        user.setGender(userParams.getGender());
        user.setInstitutionName(userParams.getInstitutionName());

        userMapper.insertSelective(user);
        int userId = user.getUserId();//line 10 in method.

        return userId;
     }
}

我写了一个测试class如下:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest extends SpringBootHelloWorldTests {

    @InjectMocks
    UserService service;

    @Mock 
    UserMapper userMapper;

    @Test
    public void testUserService_create(){

        UserParams userParams=new UserParams();
        int i=service.create(userParams);
        assertNotEquals(i,0);
    }       
}

当我执行此测试时 class 我收到一个错误,因为在创建方法的 UserService class 中 - 第 10 行。我收到 NullPointerException 因为 user 对象的 userIdnull

我知道无法模拟方法局部变量这一事实。

如果我 运行 同样 UserService 通常(在 WebApp 中),userMapper.insertSelective 方法会填充传递给该方法的用户的 userId

我们如何模拟 userMapper.insertSelective 方法,以便我可以将其配置为在我的测试 class 测试方法的用户对象中填充 userId

假设 insertSelective 是一个 void 方法,您可以使用 doAnswer, 操纵传递给模拟的参数。 (如果不是 void 方法使用 when( ... ).thenAnswer( ... )。)

@Test
public void testUserService_create() {

    Mockito.doAnswer(new Answer<Void>() {

        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {

            User user = (User) invocation.getArguments()[0];
            user.setUserId(5);

            return null;
        }}
    ).when(userMapper).insertSelective(Mockito.any(User.class));

    UserParams userParams = new UserParams();

    int i = service.create(userParams);
    Assert.assertEquals(5, i);
}