Java 测试JPA存储库的void函数以及更新和删除
我正在为crud应用程序编写测试。我需要测试服务和存储库中的Delete和Update语句。既然存储库不会返回数据,我该如何模拟存储库进行删除和更新 例如:Java 测试JPA存储库的void函数以及更新和删除,java,spring-boot,jpa,testing,junit,Java,Spring Boot,Jpa,Testing,Junit,我正在为crud应用程序编写测试。我需要测试服务和存储库中的Delete和Update语句。既然存储库不会返回数据,我该如何模拟存储库进行删除和更新 例如: @覆盖 public void makeUserActive(长用户ID){ 试一试{ 可选的userEntityList=usersJpaRepository.findById(userId); UserEntity=userEntityList.get(); userEntity.setIsActive(1); usersJpaRepo
@覆盖
public void makeUserActive(长用户ID){
试一试{
可选的userEntityList=usersJpaRepository.findById(userId);
UserEntity=userEntityList.get();
userEntity.setIsActive(1);
usersJpaRepository.save(userEntity);
}捕获(例外e){
记录器错误(“无法成为活动用户”,e);
}
}
如何测试模拟此存储库的服务以及存储库本身,因为它不会返回值对于返回
void
的方法,您只需验证它们是否已被调用即可。下面是一个模拟对象返回方法和void
返回方法的示例
@ExtendWith(MockitoExtension.class)
类服务测试{
@嘲弄
私有存储库;
@注射模拟
私有服务;//假设这是您的类
@试验
void testMakeUserActive(){
//鉴于:
最终用户实体用户实体=新用户实体();
//模拟:
when(repository.findById(1)).thenReturn(可选的(userEntity));
//当:
service.makeUserActive(1);
//然后:
验证(存储库).findById(1);
验证(存储库)。保存(用户实体);
}
}
对于返回void
的方法,您只需验证它们是否已被调用即可。下面是一个模拟对象返回方法和void
返回方法的示例
@ExtendWith(MockitoExtension.class)
类服务测试{
@嘲弄
私有存储库;
@注射模拟
私有服务;//假设这是您的类
@试验
void testMakeUserActive(){
//鉴于:
最终用户实体用户实体=新用户实体();
//模拟:
when(repository.findById(1)).thenReturn(可选的(userEntity));
//当:
service.makeUserActive(1);
//然后:
验证(存储库).findById(1);
验证(存储库)。保存(用户实体);
}
}
问题是你想测试什么?
如果您想测试存储库,可以使用Springs@DataJpaTest
实现这一点。看
如果要测试makeUserActive
-方法中的逻辑,必须确保模拟存储库
假设包含makeUserActive
-方法的服务如下所示:
public class UserService{
private final UsersJpaRepository usersJpaRepository;
public UserService(UsersJpaRepository usersJpaRepository) {
this.usersJpaRepository = usersJpaRepository;
}
public void makeUserActive(long userId){
// your code from your question
}
}
@Test
void makeUserActiveTest(){
UsersJpaRepository repository = new InMemoryUsersJpaRepository();
UserEntity user = new UserEntity();
user = repository.save(user);
UserService service = new UserService(repository);
service.makeUserActive(user.getId());
Optional<UserEntity> activatedUser = repository.findById(user.getId());
assertTrue(activatedUser.isPresent());
assertEquals(1, activatedUser.get().isActive());
}
public class InMemoryUsersJpaRepository extends UsersJpaRepository {
private Map<Long, UserEntity> users = new HashMap<>();
private Long idCounter = 1L;
@Override
public UserEntity save(UserEntity user) {
if(user.getId() == null){
user.setId(idCounter);
idCounter++;
}
users.put(user.getId(), user);
return user;
}
@Override
public Optional<UserEntity> findById(long userId) {
return Optional.of(users.get(userId));
}
}
您可以这样编写单元测试:
public class UserService{
private final UsersJpaRepository usersJpaRepository;
public UserService(UsersJpaRepository usersJpaRepository) {
this.usersJpaRepository = usersJpaRepository;
}
public void makeUserActive(long userId){
// your code from your question
}
}
@Test
void makeUserActiveTest(){
UsersJpaRepository repository = new InMemoryUsersJpaRepository();
UserEntity user = new UserEntity();
user = repository.save(user);
UserService service = new UserService(repository);
service.makeUserActive(user.getId());
Optional<UserEntity> activatedUser = repository.findById(user.getId());
assertTrue(activatedUser.isPresent());
assertEquals(1, activatedUser.get().isActive());
}
public class InMemoryUsersJpaRepository extends UsersJpaRepository {
private Map<Long, UserEntity> users = new HashMap<>();
private Long idCounter = 1L;
@Override
public UserEntity save(UserEntity user) {
if(user.getId() == null){
user.setId(idCounter);
idCounter++;
}
users.put(user.getId(), user);
return user;
}
@Override
public Optional<UserEntity> findById(long userId) {
return Optional.of(users.get(userId));
}
}
这样,您将测试makeUserActive
-方法的逻辑,该方法当前只需在您的UserEntity上设置isActivated
标志
我还想提醒你关于库拉米先生的问题。 他的答案中的代码将导致通过测试,但我很确定它不会测试您想要测试的东西。
您应该始终测试方法的预期和可观察行为。 在您的情况下,这将是
isActivated
标志,该标志应为1。您的
makeUserActive
-方法调用UsersJpaRepository
的findById
和save
方法这一事实仅仅是一个实现细节,对这些方法的测试通常会导致脆弱的测试。问题是您想要测试的东西是什么?
如果您想测试存储库,可以使用Springs@DataJpaTest
实现这一点。看
如果要测试makeUserActive
-方法中的逻辑,必须确保模拟存储库
假设包含makeUserActive
-方法的服务如下所示:
public class UserService{
private final UsersJpaRepository usersJpaRepository;
public UserService(UsersJpaRepository usersJpaRepository) {
this.usersJpaRepository = usersJpaRepository;
}
public void makeUserActive(long userId){
// your code from your question
}
}
@Test
void makeUserActiveTest(){
UsersJpaRepository repository = new InMemoryUsersJpaRepository();
UserEntity user = new UserEntity();
user = repository.save(user);
UserService service = new UserService(repository);
service.makeUserActive(user.getId());
Optional<UserEntity> activatedUser = repository.findById(user.getId());
assertTrue(activatedUser.isPresent());
assertEquals(1, activatedUser.get().isActive());
}
public class InMemoryUsersJpaRepository extends UsersJpaRepository {
private Map<Long, UserEntity> users = new HashMap<>();
private Long idCounter = 1L;
@Override
public UserEntity save(UserEntity user) {
if(user.getId() == null){
user.setId(idCounter);
idCounter++;
}
users.put(user.getId(), user);
return user;
}
@Override
public Optional<UserEntity> findById(long userId) {
return Optional.of(users.get(userId));
}
}
您可以这样编写单元测试:
public class UserService{
private final UsersJpaRepository usersJpaRepository;
public UserService(UsersJpaRepository usersJpaRepository) {
this.usersJpaRepository = usersJpaRepository;
}
public void makeUserActive(long userId){
// your code from your question
}
}
@Test
void makeUserActiveTest(){
UsersJpaRepository repository = new InMemoryUsersJpaRepository();
UserEntity user = new UserEntity();
user = repository.save(user);
UserService service = new UserService(repository);
service.makeUserActive(user.getId());
Optional<UserEntity> activatedUser = repository.findById(user.getId());
assertTrue(activatedUser.isPresent());
assertEquals(1, activatedUser.get().isActive());
}
public class InMemoryUsersJpaRepository extends UsersJpaRepository {
private Map<Long, UserEntity> users = new HashMap<>();
private Long idCounter = 1L;
@Override
public UserEntity save(UserEntity user) {
if(user.getId() == null){
user.setId(idCounter);
idCounter++;
}
users.put(user.getId(), user);
return user;
}
@Override
public Optional<UserEntity> findById(long userId) {
return Optional.of(users.get(userId));
}
}
这样,您将测试makeUserActive
-方法的逻辑,该方法当前只需在您的UserEntity上设置isActivated
标志
我还想提醒你关于库拉米先生的问题。 他的答案中的代码将导致通过测试,但我很确定它不会测试您想要测试的东西。
您应该始终测试方法的预期和可观察行为。 在您的情况下,这将是
isActivated
标志,该标志应为1。您的
makeUserActive
-方法调用UsersJpaRepository
的findById
和save
方法,这只是一个实现细节,对这些方法的测试通常会导致脆弱的测试