1
votes

Spring Boot se charge avant Cassandra intégré lors de l'utilisation de concombre, comment puis-je résoudre ce problème?

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();
    }


0 commentaires

3 Réponses :


0
votes

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.


6 commentaires

@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.



0
votes

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
}


0 commentaires

0
votes

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.


0 commentaires