J'ai des problèmes avec spring-cassandra-unit, spring-boot et spring-cucumber. La configuration ci-dessous fonctionne très bien pour les tests unitaires, mais dès que j'ajoute du concombre de printemps dans le mélange et que j'essaye quelques tests d'intégration, il semble qu'elle ignore complètement mon MyCustomOrderedTestExecutionListener et charge le démarrage à ressort avant cassandra, me donnant une "NoHostFoundException".
Je pourrais vraiment utiliser des conseils pour m'assurer que la cassandra intégrée est chargée en premier. Toute aide est grandement appréciée.
La configuration suivante:
class CucumberTestContextManager extends TestContextManager { public CucumberTestContextManager(Class<?> testClass) { super(testClass); this.registerGlueCodeScope(this.getContext()); } private ConfigurableApplicationContext getContext() { return (ConfigurableApplicationContext)this.getTestContext().getApplicationContext(); } ... }
Mon écouteur d'exécution de test ordonné personnalisé:
public void start() { if (this.stepClassWithSpringContext != null) { this.testContextManager = new CucumberTestContextManager(this.stepClassWithSpringContext); } else if (this.beanFactory == null) { this.beanFactory = this.createFallbackContext(); } this.notifyContextManagerAboutTestClassStarted(); if (this.beanFactory == null || this.isNewContextCreated()) { this.beanFactory = this.testContextManager.getBeanFactory(); Iterator var1 = this.stepClasses.iterator(); while(var1.hasNext()) { Class<?> stepClass = (Class)var1.next(); this.registerStepClassBeanDefinition(this.beanFactory, stepClass); } } GlueCodeContext.INSTANCE.start(); }
3 Réponses :
Actuellement, Cucumber appelle uniquement TestContextManager.beforeClass
et TestContextManager.afterClass
. Cependant, cela se produit avant chaque scénario, donc remplacer TestExecutionListener.afterTestClass
devrait faire l'affaire.
@CoffeeIsProgramming Que dois-je regarder? Après la méthode et après la classe, il y a deux hooks différents. Vous ne regardez pas non plus la classe avant, encore un autre crochet.
Désolé aurait dû être plus précis. Je regarde le code source de Cassandra Spring. Mon point est que j'ai besoin d'Embedded Cassandra pour charger avant Spring Boot. Spring essaie immédiatement de se connecter à Cassandra lorsqu'il démarre et s'il démarre en premier, il n'y a rien auquel se connecter. Dans la version 1.2.5 de cucumber-spring, TestExecutionListener.afterTestClass ne sera appelé que bien après le chargement du contexte d'application. En fait, TestExecutionListener.beforeTestClass non plus. Je vais vérifier avantTest, je ne l'ai pas encore vérifié ...
Le concombre n'appelle pas avant le test IIRC.
Il vaut mieux envoyer un PR à Cucumber pour résoudre ce problème.
Merci fera l'affaire. En plus d’essayer moi-même un patch, c’est tout ce que je peux faire.
Je vais vous donner la réponse sur celui-ci. Vous avez pu m'aider à m'orienter dans la bonne direction et me donner des conseils sur les crochets que je devrais regarder.
Voici comment procéder:
IntegrationConfig:
class AccessControllerSpec extends ComponentTestSpecification { // test methods }
ComponentTestSpecification :
@ContextConfiguration(classes = Application.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) @Import(IntegrationConfiguration.class) abstract class ComponentTestSpecification { // reusable integration-test methods here }
Le test (groovy, devrait être convertible en jUnit / peu importe):
class IntegrationConfiguration { // your cassandra startup }
Vous pouvez le faire via https://github.com/nosan/embedded-cassandra le projet
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import com.github.nosan.embedded.cassandra.test.spring.EmbeddedCassandra; @SpringBootTest @ActiveProfiles("INTEGRATION_TEST") @EmbeddedCassandra(configurationFile = "cassandra.yaml", scripts = "cql/dataset1.cql") public class TestStepDef { }
@EmbeddedCassandra
est géré par org.springframework.test.context.ContextCustomizer
ainsi vous n'aurez aucun problème avec un démarrage.