2

在我的 WebApp 中,我使用了 MyBatisGenerator 来生成映射器接口。我有一个类 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;
     }
}

我写了一个测试类如下:

@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);
    }       
}

当我执行这个测试类时,我收到一个错误,因为在UserService创建方法中的类中 - 第 10 行。我得到的NullPointerExceptionuserId对象usernull

我知道不可能模拟方法局部变量的事实。

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

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

4

1 回答 1

1

假设这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);
}
于 2019-11-22T14:33:51.823 回答