当前位置: 首页 > 知识库问答 >
问题:

嵌入Cassandra之前的Spring Boot负载当使用Cucumber时,如何修复此问题?

苏胤
2023-03-14

我在使用spring-cassandra-Unit、spring-boot和spring-cucumber时遇到了一些问题。下面的配置适用于单元测试,但是一旦我将spring-cucumber添加到混合中并尝试一些集成测试,它似乎完全忽略了我的MyCustomOrderedTestExecutionListener并在cassandra之前加载Spring boot,给我一个“NoHostFoundException”。

关于如何确保首先加载嵌入式cassandra,我真的需要一些建议。非常感谢您的帮助。

以下设置:

@ActiveProfile("INTEGRATION_TEST")
@SpringBootTest
@EmbeddedCassandra(configuration = "cassandra.yaml")
@TestExecutionListeners(
  listeners = MyCustomOrderedTestExecutionListener.class,
  mergeMode = MERGE_WITH_DEFAULTS)
@CassandraDataSet(value = "cql/dataset1.cql", keyspace = "mykeyspace")
public class TestStepDef{

//omitted for brevity

} 

我的自定义顺序测试执行侦听器:

public class MyCustomOrderedTestExecutionListener extends AbstractTestExecutionListener {

    @Override
    public void afterTestMethod(TestContext testContext) throws Exception {
       //omitted for brevity
    }

    @Override
    public int getOrder() {
        return  Ordered.HIGHEST_PRECEDENCE;
    }
}

cucumber测试跑步者:

@RunWith(Cucumber.class)
@CucumberOptions(features="resources/features", glue="resources/glue")
public class TestRunner {}

编辑:

查看cucumber spring的spring工厂,应用程序上下文甚至在执行ForeTestClass之前就已加载(在notifyContextManagerAboutTestClassStarted执行ForeTestClass之前):

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

更深入地说,我们可以看到应用程序上下文加载在此处:

class CucumberTestContextManager extends TestContextManager {
    public CucumberTestContextManager(Class<?> testClass) {
        super(testClass);
        this.registerGlueCodeScope(this.getContext());
    }

     private ConfigurableApplicationContext getContext() {
    return (ConfigurableApplicationContext)this.getTestContext().getApplicationContext();
     }
...

}

有什么关于如何解决这个问题的建议吗?

共有3个答案

沈华晖
2023-03-14

您可以通过https://github.com/nosan/embedded-cassandra项目

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 {


}

嵌入式Cassandra由组织处理。springframework。测验上下文因此,您在启动时不会遇到任何问题。

唐弘和
2023-03-14

我是这样做的:

集成配置:

class IntegrationConfiguration {
// your cassandra startup
}

组件测试规范:

@ContextConfiguration(classes = Application.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@Import(IntegrationConfiguration.class)
abstract class ComponentTestSpecification {
// reusable integration-test methods here
}

测试(groovy,应该可以转换为jUnit/任何):

class AccessControllerSpec extends ComponentTestSpecification {
// test methods
}
沈长恨
2023-03-14

目前Cucumber只调用TestContextManager。在类和测试上下文管理器之前。后级。然而,这发生在每个场景之前,所以覆盖TestExecutionListener。后测试类(afterTestClass)应该可以做到这一点。

 类似资料:
  • 我以前有过这个问题。在Amazon的EC2负载平衡器后面运行WordPress(或其他PHP脚本)时,这些脚本没有意识到它们是在https://protocol上运行的,并且会导致诸如无休止的重定向循环和https警告等问题(“此页面上的某些内容是以非安全方式请求的…”)。 我在这里找到了一个解决方案,但需要修改WordPress core,这对可更新性没有好处:https://wordpress

  • 我让cassandra在3个节点上运行,其中一致性为1。Nodetool修复也在服务器上调度。

  • 我试图做Java本地接口,这是使用gcc编译c文件和Java代码是 如何修复输出NaN

  • 问题内容: 我正在Python 3.8中设置自动点击程序,我需要Win32api来获取GetAsyncKeyState,但它总是给我这个错误: 我在Windows 10 Home 64x上。我已经尝试过了 它成功安装,但没有任何变化。我也尝试卸载并重新安装python。我还尝试以相同的方式安装“ django”,并且在我安装时实际上可以正常工作,因此我认为这仅是win32api问题。 我希望输出为

  • 我开始了一个新的项目,并把火基地云: 这个错误出现了: 警告:API的变体。getJavaCompile()已过时,已替换为“variant”。getJavaCompileProvider()。它将于2019年底拆除。有关详细信息,请参阅https://d.android.com/r/tools/task-configuration-avoidance.确定什么是调用变量。getJavaCompi

  • 我正在编程一个需要Hibernate技术的项目。我得到了堆栈痕迹,但我不知道如何修复它。有什么需要帮忙的吗? 这是我的堆栈跟踪,我得到了这两个错误: SLF4J:slf4j-api 1.6.x(或更高版本)与此绑定不兼容。SLF4J:您的绑定是1.5.5或更早版本。SLF4J:将绑定升级到1.6.x版本。或2.0.x 导入org.hibernate.hibernateException;导入org