Comment vérifier si-déclaration de la méthode, à l'aide de Mockito et JUnit?
J'ai la méthode que je dois tester. Code (bien sûr, certaines parties ont été coupées):
public class FilterDataController {
public static final String DATE_FORMAT = "yyyy-MM-dd";
@Autowired
private FilterDataProvider filterDataProvider;
@ApiOperation(value = "Get possible filter data",response = ResponseEntity.class)
@ApiResponses(value = {
@ApiResponse(...),
@ApiResponse(...)})
@RequestMapping(path = "...", method = RequestMethod.GET)
public ResponseEntity<Object> getPossibleFilterData(
@RequestParam(value = "startDate") @DateTimeFormat(pattern=DATE_FORMAT) final Date startDate,
@RequestParam(value = "endDate") @DateTimeFormat(pattern=DATE_FORMAT) final Date endDate) {
if (endDate.compareTo(startDate) == -1){
throw new ValueNotAllowedException("End date should be after or equal start date");
}
else {
Date newEndDate = endDate;
if (startDate.equals(endDate)){
newEndDate = new Date(endDate.getTime() + TimeUnit.DAYS.toMillis(1) - 1);
}
List<String> possibleCountries = Lists.newArrayList(filterDataProvider.getPossibleCountries(startDate, newEndDate));
return new ResponseEntity<>(new FilterResponse(possibleCountries),HttpStatus.OK);
}
}
}
Question: comment faire pour vérifier si l'instruction dans la méthode getPossibleFilterData
à l'aide de Mockito et JUnit? Je veux passer à l'égalité des dates à la méthode, puis vérifier que mon if fonctionne correctement.
- Comme mentionné dans beaucoup de réponses ci-dessous, vos tests ne devriez pas supposer que votre mise en œuvre: que faire si vous refactoriser la méthode afin qu'il renvoie des valeurs correctes, mais n'utilise pas de
if
instruction à tous? Au lieu de supposer que, transmettre des valeurs erronées et passer le test uniquement lorsque vous attraper le bon d'exception. - merci pour les conseils.
Vous devez vous connecter pour publier un commentaire.
Si vous voulez vraiment un pur unité de test pas de test d'intégration, vous pouvez compter sur l'annotation
@Mock
à se moquer de votre serviceFilterDataProvider
et@InjectMocks
afin d'injecter votre fantaisie dans votre instance deFilterDataController
.Ensuite, vous pouvez proposer des 3 tests:
ValueNotAllowedException
qui pourraient être testés hors de la zone à l'aide@Test(expected = ValueNotAllowedException.class)
.Si vous avez besoin pour vous assurer que
filterDataProvider.getPossibleCountries(startDate, newEndDate)
a été appelé avec les arguments attendus, vous devez utiliserverify
.Le code serait alors quelque chose comme ça:
filterDataProvider
a été appelé avec la date correcte? Je veux envoyé àgetPossibleFilterData
l'égalité des dates et vérifiez quefilterDataProvider.getPossibleCountries(startDate, newEndDate)
appelé avec la correction des dates.Vous aurez à se moquer de
FilterDataProvider
et puis à l'injecter dans votre classe de test à l'aide de InjectMocks.getPossibleFilterData
à la méthode en cours de test, afin de choisir une date donnée (utiliserCalendar.set(...)
, puisCalendar.getTime()
) et l'envoyer à cette même date que les deux startDate et endDate.Maintenant, après
getPossibleFilterData
est terminée, vous pouvez vérifier sifilterDataProvider.getPossibleCountries
a été appelé avec une Date de fin qui est une milliseconde plus que la date de départ. Cela peut être fait parCalendar.getTimeInMillis()
à l'intérieur de la classe factices de la méthode, ou en vérifiant avec Mockito avec une Date d'une milliseconde plus de la date initialement spécifié.Edit: exemple de Code fourni:
FilterDataController
, mais dans ma situation, il est incongrue.Mais merci pour cette approche. Je vais le rappeler. +1Je vois deux approches principales.
verify
. Il y a des exemplesverify(test).testing(Matchers.eq(12));
. Mais dans mon cas, je veux vérifier que la méthode dans ma méthode a été appelée avec la correction des dates. Peut-être qch comme çanewEndDate = ...; verify(FilterDataController).getPossibleFilterData().getPossibleCountries(Matchers.eq(startDate, newEndDate));