JUnit测试用@Modification注释的本机查询



我正在制作一个SpringBoot应用程序,其中有两个具有多对多关系的类:User和Plant。我使用的是MySQL数据库,其中有表usersplants和两个类的联接表user_plants

然后我有一个UserRepository接口,在那里我定义了一个从user_plants表中删除条目的方法:

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
@Modifying
@Query(value = "DELETE FROM user_plants WHERE user_id = ?1 AND plant_id = ?2", nativeQuery = true)
void deletePlantById(int userId, int plantId);
}

此方法稍后在UserService类中使用:

@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository){
this.userRepository = userRepository;   }
@Transactional
public void deletePlant(int userId, int plantId){
userRepository.deletePlantById(userId, plantId);
}}

我最近开始学习单元测试,我正在尝试为UserRepository编写一个单元测试。我成功地测试了所有默认的JpaRepository方法,如getByIdfindAll等。然而,我实现的方法的测试总是失败。

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
private User user;
@BeforeEach
public void setUp(){
Set<Plant> plantsSet = new LinkedHashSet<>();
plantsSet.add(new Plant(5, "Monstera"));
user = new User(1, "Alice", plantsSet);
userRepository.save(user);
}
@AfterEach
public void clean(){
userRepository.deleteAll();
user = null;
}
@Test
void givenPlantIdAndUserIdShouldDeletePlantOfThatIdFromUserPlants() {
userRepository.deletePlantById(1, 5);
assertTrue(user.getOwnedPlants().isEmpty());
}

我手动测试了这个方法,我可以看到它工作正常——对数据库的更改是按照我想要的方式进行的。那么,为什么测试失败呢?我该怎么写呢?

执行此行时

userRepository.deletePlantById(1, 5);

您正在删除数据库中的用户植物,但对象user中仍有用户植物列表。

为了检查删除是否正确,您必须执行查询,根据用户id查找用户植物。我假设接口UserPlantRepository存在。

@Test
void givenPlantIdAndUserIdShouldDeletePlantOfThatIdFromUserPlants() {
userRepository.deletePlantById(1, 5);
assertTrue(userPlantRepository.findByUserId(1)).isEmpty()
}

最新更新