J'utilise le projet réacteur-test et le projet StepVerifier pour tester ma fonction, En interne, Comment puis-je faire cela avec le Mise à jour 1: Notez que myFunc () myFunc code>, qui renvoie un
fait des appels réels à un (faux) serveur http fonctionnant localement à des fins de test. Je pense donc que définir une heure virtuelle n'est pas possible. Flux
:Flux<Result> results = myFunc()
StepVerifier.create(results). ..
myFunc
utilise le limiteur de débit de resilience4j et je veux vérifier que au moins une certaine durée doit être passée avant que le flux ne soit terminé en utilisant le StepVerifier
. StepVerifier
?
Mise à jour 2:
À titre d'exemple, disons que myFunc () code> fait 30 demandes avec la limite de débit configurée à 10 rps, donc je m'attends à ce que l'abonnement dure un peu plus de 3 secondes. C'est à dire. Je veux vérifier que 30 demandes ont été effectuées (
expectNextCount (30)
) et qu'un certain laps de temps (3s) doit s'être écoulé.
3 Réponses :
Pour moi, il semble que la méthode thenAwait (Duration timeshift) soit ce que vous recherchez.
StepVerifier.Step<T> thenAwait(Duration timeshift) Pause the expectation evaluation for a given Duration. If a VirtualTimeScheduler has been configured, VirtualTimeScheduler.advanceTimeBy(Duration) will be used and the pause will not block testing or Publisher thread.
Merci pour votre suggestion, mais cela ne semble pas fonctionner. Si j'essaye StepVerifier.create (results) .thenAwait (Duration.ofMillis (10) ) .verifyComplete ()
, cela n'échoue pas le test même si cela prend plusieurs secondes.
Je vois. Excusez-moi, je n'ai pas eu la possibilité de le tester. Cependant, je ne sais pas si c'est intentionnel, mais au cas où ce ne serait pas le cas - vous avez spécifié 10 millisecondes, ce qui correspond à 1/100 de seconde. Je ne suis pas sûr que cela attend plus que cela et cela pourrait signifier que c'est encore un temps qui passe. Si vous voulez des secondes, cela devrait être Duration.ofSeconds (numerOfSeconds).
Je voulais juste montrer un cas où je m'attendrais à ce que le test échoue (car il devrait prendre plus d'une seconde) mais ce n'est pas le cas.
Je vois. Merci pour la clarification! Je vais l'examiner un peu plus!
Il semble que j'ai manqué une partie importante: il existe une méthode appelée withVirtualTime
. Il doit être ajouté avant d'utiliser thenAwait ()
Avez-vous essayé cela?
Oui, mais j'ai mis à jour la question pour inclure que myFunc ()
fait des requêtes http à un serveur en cours d'exécution. Je suppose que cela rend l'utilisation du temps virtuel impossible puisque aucune demande ne sera faite.
Ce que vous recherchez, c'est expectNoEvent (Duration)
. Notez que l'abonnement est un événement qui se produit (presque) toujours, donc pour une séquence vide, vous devriez avoir quelque chose comme:
StepVerifier.create(result) .expectSubscription() .expectNoEvent(Duration.ofMillis(100)) .verifyComplete();
Cela ne fonctionne pas car j'attends effectivement des données. Par exemple, si je fais 30 demandes avec une limite de débit fixée à 10 rps, je m'attends à ce que l'abonnement dure un peu plus de 3 secondes. C'est ce que je veux vérifier. Je vais mettre à jour la question pour refléter cela.
verify ()
renvoie un objet Duration
marquant la durée réelle de la vérification. De cette façon, vous pouvez vérifier combien de temps cela a pris au total.
Cependant, il semble qu'il ne prenne pas en compte withVirtualTime
- il renverra toujours la durée réelle de la vérification, et non l'heure virtuelle, ce qui la rend beaucoup moins utile.
/ p>