Comment trouver le port de Printemps de Démarrage du conteneur lors de l'exécution d'un spock test à l'aide de la propriété server.port=0
Donné cette entrée dans application.properties
:
server.port=0
qui provoque Printemps de Démarrage pour choisir un hasard de port disponible, et l'essai d'un printemps de démarrage de l'application web à l'aide de spock, comment peut-spock code de savoir sur quel port de frapper?
Normal injection comme ceci:
@Value("${local.server.port}")
int port;
ne fonctionne pas avec spock.
OriginalL'auteur Bohemian | 2014-07-09
Vous devez vous connecter pour publier un commentaire.
Vous pouvez trouver le port à l'aide de ce code:
Qui, pour ceux qui s'intéressent à la java équivalent est:
Voici une classe abstraite qui vous pouvez s'étend, qui s'achève cette initialisation du printemps de démarrage de l'application et détermine le port:
Que vous pouvez utiliser comme ceci:
OriginalL'auteur Bohemian
L'injection de travail avec Spock, aussi longtemps que vous avez configuré votre spec correctement et ont
spock-spring
sur le chemin de la classe. Il y a un limitation de Spock Printemps ce qui signifie qu'il ne configurez votre application de Démarrage si vous utilisez@SpringApplicationConfiguration
. Vous avez besoin d'utiliser@ContextConfiguration
et de la configurer manuellement à la place. Voir cette réponse pour plus de détails.La deuxième partie du problème est que vous ne pouvez pas utiliser un GString pour la
@Value
. Vous pouvez échapper à la$
, mais il est plus facile d'utiliser les guillemets simples:Mettre cet ensemble, vous obtenez une spécification qui ressemble à quelque chose comme ceci:
Notez également l'utilisation de
@IntegrationTest("server.port=0")
à la demande d'un port aléatoire être utilisé. C'est une belle alternative à la configuration dansapplication.properties
.Andy réponse aurait été marqué comme réponse. Sa solution pour obtenir des numéros de port avec le @chaîne de Valeur est beaucoup plus élégant.
BTW, @andy-wilkinson, spock-printemps prend désormais en charge
@SpringBootTest
comme une seule annotation au lieu d'avoir à combiner@ContextConfiguration
,@WebAppConfiguration
, et@IntegrationTests
. Donc tout ce que vous avez à faire est de:@SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
OriginalL'auteur Andy Wilkinson
Que vous pourriez faire cela aussi:
OriginalL'auteur Camilo