Я пытаюсь провести модульное тестирование класса обслуживания Rest с именем AdRestService.
package api.rest;
// import things..
@ApplicationScoped
@Path("/ad")
@Default // To be injected in the Test
public class AdRestService {
@Inject
private AdService adService;
@Inject
private AdProducer adProducer;
@POST
@Consumes("application/json")
public Response create(Ad ad) {
Long newId = null;
try {
newId = adService.create(ad);
} catch(IllegalArgumentException i) {
return Response.status(Status.BAD_REQUEST).build();
} catch(Exception e) {
return Response.status(Status.BAD_GATEWAY).build();
}
adProducer.send(ad, "adsCreate");
return Response.status(Status.CREATED).location(URI.create("/ad/" + newId.toString())).build();
}
@GET
@Produces("application/json")
public List<Ad> getAll() {
return adService.getAll();
}
}
И класс тестирования:
package api.rest;
//import things ..
@ExtendWith(JpaUnit.class)
@ExtendWith(MockitoExtension.class)
public class AdRestServiceTest {
@Spy
@PersistenceContext(unitName = "AdPUTest")
EntityManager em;
@Mock // @InjectMocks // @Spy ??
private AdRestService adRestService;
@Mock // @InjectMocks // @Spy ??
private AdServiceImpl adServiceImpl;
@Test
public void testGetAll() {
int size = initDataStore();
assertEquals(size, adRestService.getAll().size());
}
@Test
public void testGet() {
initDataStore();
List<Ad> ads = adRestService.getAll(); // ads is null and so we cannot test isEmpty
//if (ads.isEmpty())
// initDataStore();
Long id = ads.get(0).getId();
Ad ad = adRestService.get(id);
assertEquals(ads.get(0).getId(), ad.getId());
assertEquals(ads.get(0).getTitle(), ad.getTitle());
}
///// Methods for testing
private List<Ad> getAds() {
List<Ad> ads = new ArrayList<>();
long numberOfAd = Math.round((Math.random() * 10)) + 1;
for (int i = 0; i < numberOfAd; i++) {
ads.add(getRandomAd());
}
return ads;
}
private int initDataStore() {
int size = adRestService.getAll().size();
List<Ad> ads = getAds();
for (Ad ad : ads) {
adServiceImpl.create(ad);
}
return size + ads.size();
}
private Ad getRandomAd() {
Ad ad = new Ad();
ad.setTitle(UUID.randomUUID().toString());
ad.setDescription(UUID.randomUUID().toString());
Random r = new Random();
ad.setPrice(r.nextDouble());
Long randomDate = -946771200000L + (Math.abs(r.nextLong()) % (70L * 365 * 24 * 60 * 60 * 1000));
ad.setDate(new Date(randomDate));
ad.setUserId(r.nextLong());
ad.setCategoryId(r.nextLong());
return ad;
}
/////
}
Если я добавлю @InjectMocks, я получу исключение NullPointerException при попытке вызвать adRestService.getAll () ;. Я пытался @Spy действительно создать объект и поэтому избегать NullPointer, но я получаю ту же ошибку.
Вот два класса, которые работают:
@ExtendWith(JpaUnit.class)
@ExtendWith(MockitoExtension.class)
public class AdServiceTest {
@Spy
@PersistenceContext(unitName = "AdPUTest")
EntityManager em;
@InjectMocks
private AdServiceImpl adServiceImpl;
@Test
public void testGetAll() {
int size = initDataStore();
assertEquals(size, adServiceImpl.getAll().size());
}
какие тесты:
package domain.service;
import java.util.List;
import domain.model.Ad;
public interface AdService {
public Long create(Ad ad);
public void delete(Ad ad);
public void update(Ad ad);
public List<Ad> getAll();
public Ad get(Long adId);
}
Я не знаю, почему он не будет работать для остальных, но правильно работает для AdService ... какая-нибудь помощь?