This is what I tried:
@RunWith(SpringRunner.class) @DataJpaTest @ActiveProfiles("h2") @Rollback(false) @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) public class ServiceTest { private EntityManager entityManager; public ServiceTest(EntityManager entityManager) { this.entityManager = entityManager; } @Test public void findLocation() { Location location = entityManager.find(Location.class, 2); assertEquals(location.getName(), "Avenue"); } @Test public void updateLocation() { Location location = entityManager.find(Location.class, 2); location.setNo_people(10); entityManager.persist(location); entityManager.flush(); } }
the error that I get is ‘ Runner org.junit.internal.runners.ErrorReportingRunner (used on class com.unibuc.AWBD_Project_v1.services.ServiceTest) does not support filtering and will therefore be run completely. Test class should have exactly one public zero-argument constructor’
Here is the LocationService:
@Service public class LocationService implements BaseService<Location> { private final LocationRepository locationRepository; @Autowired public LocationService(com.unibuc.AWBD_Project_v1.repositories.LocationRepository locationRepository) { this.locationRepository = locationRepository; } @Override public Location insert(Location object) { return locationRepository.save(object); } @Override public Location update(Long id, Location updatedObject) { var foundId = locationRepository.findById(id); return foundId.map(locationRepository::save).orElse(null); } @Override public List<Location> getAll() { return locationRepository.findAll(); } @Override public Optional<Location> getById(Long id) { return locationRepository.findById(id); } @Override public void deleteById(Long id) { try { locationRepository.deleteById(id); } catch (LocationException e) { throw new LocationException("Location not found"); } } @Override public Page<Location> findAll(int page, int size, String sortBy, String sortType){ Sort sort = sortType.equalsIgnoreCase(Sort.Direction.ASC.name()) ? Sort.by(sortBy).ascending() : Sort.by(sortBy).descending(); Pageable pageable = PageRequest.of(page - 1, size, sort); return locationRepository.findAll(pageable); } }
Advertisement
Answer
Hello there is 3 issues in your test code.
1 you should remove the EntityManager entityManager from your test constructor to have a runnable test class.
2 if you want to use entityManager inside your test class you should @Autowired it
public class ServiceTest { @Autowired private EntityManager entityManager;
3 It’s look like you are testing entityManager and not your LocationService In an unit test you should mock dependencies like entityManager using Mockito
It’s seems like you wanted to create an integration test.
The 3 steps of one integration test of a service (exemple with findLocation())
Prepare the data inside a test database Create a new location object and save it into database using the entityManager or the testEntityManager.
Execute your findLocation methode on the id Don’t forget to Autowire your service class.
Verify if the retrieved data is as expected Compare the retrieved Location object with the one you’ve saved.
Here’s the code
@RunWith(SpringRunner.class) @DataJpaTest @ActiveProfiles("h2") @Rollback(false) @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) public class ServiceTest { @Autowired private EntityManager entityManager; @Autowired private LocationService locationService; public ServiceTest() { } @Test public void findLocation() { //given Location location = new Location(....); entityManager.save(location); //when Location foundLocation=locationService.getById(location.getId()); //then assertTrue(foundLocation.isPresent()); assertEquals(foundLocation.get().getName(), "Avenue"); }
If you have any question I’m available to help you.