如何配置 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
对象的 userId
是 null
。
我知道无法模拟方法局部变量这一事实。
如果我 运行 同样 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);
}
在我的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
对象的 userId
是 null
。
我知道无法模拟方法局部变量这一事实。
如果我 运行 同样 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);
}