'JUnit testing native queries annotated with @Modifying
I'm making a SpringBoot app where I have two classes with many-to-many relationship: User and Plant. I'm using a MySQL database, where I have tables users, plants and a joined table for the two classes user_plants.
I then have a UserRepository interface, where I defined a method for deleting entries from the user_plants table:
@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);
}
This method is later used in UserService class:
@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);
}}
I have recently started learning about unit tests and I'm trying to write a unit test for UserRepository. I managed to successfully test all of the default JpaRepository methods, such as getById, findAll etc. However, the test for the method implemented by me always fails.
@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());
}
I tested this method manually and I could see that it works correctly - changes to the database were made the way that I wanted. So why does the test fail? How should I go about writing it?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
