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

Dropwizard使用Mocks for DB进行集成测试

韩博厚
2023-03-14

第一:是的,我读到了https://dropwizard.github.io/dropwizard/manual/testing.html

我想做一些集成测试,以及为什么我必须启动整个应用程序。现在的问题是,我有一些与“外部世界”的接口,如DB或一个内部的Rest-Client,它与一个远程应用程序交谈。我想用嘲弄来嘲笑他们。通常这没问题。

现在我的问题是:如何使用模拟数据库和模拟客户端启动整个应用程序?

目前的问题是,我通过 getDBClient() 从我的配置类获取此数据库连接和客户端...我不愿意在我的配置中构建一些测试代码,因为它的生产代码。因此,如果我通过DropwizardAppRule启动整个应用程序,该应用程序会尝试连接到数据库,但在测试环境中,没有可用的数据库。

有没有一种简单的方法可以说:启动我的应用程序,但如果你调用DB或客户端,那么使用这个XY模拟?

我还尝试了什么:一个新类“扩展服务扩展服务扩展应用程序”和一个“ExtService配置扩展服务配置”,但没有任何成功。但是,如果我重写配置类中的某些方法返回模拟,我会遇到麻烦。它不能全部放在一起。

目前我阅读了模拟间谍的文档,也许这可以提供帮助,但我不确定如何在DW集成测试中使用它。我现在尝试模拟我的配置类方法中的2个,以返回数据库和客户端模拟。也许有人可以帮助我,如何在下一个示例代码中模拟测试配置:

@ClassRule
public static final DropwizardAppRule<TestConfiguration> RULE =
        new DropwizardAppRule<TestConfiguration>(MyApp.class, resourceFilePath("my-app-config.yaml"));

编辑:@类规则公共静态最终DropwizardAppRuleRULE=new DropwizardAppRule(……)

在@BeforeClass中,我执行以下操作:

ServiceConfiguration oldConfig = RULE.getConfiguration();
ServiceConfiguration spy = Mockito.spy(oldConfig);
//Then DB mocking
IDatabaseLayer dBMock = mock(IDatabaseLayer.class);
Mockito.when(dBMock.isConnected()).thenReturn(true);
... // other mocking functions for DB
//this is important, it say, that the mocked config class should use the mocked DB
Mockito.doReturn(dBMock).when(spy).getDataBaseLayer(); // my configuration class has this method, so mocking config class with last created dbMock
// do other mockings if needed

这就是我启动整个应用程序所做的一切。

共有3个答案

史磊
2023-03-14

我认为您应该使用io.dropwizard.testing.junit。ResourceTestRule,用于测试Jersey资源(即调用RESTAPIendpoint)。DropwizardAppRule将启动整个应用程序,并在测试结束时停止。该类似乎旨在进行端到端测试,在这种测试中,您不会进行任何模拟。

岑畅
2023-03-14

如果您想模拟特定的东西,但仍然保留dropwizard的整个流程,那么您需要管理自己的Application实例,并使您的依赖项能够注入到您的Application类中。因为DropwizardApprude没有给您这种灵活性。

示例:您希望能够重写应用程序类上的依赖项。

public class MyApplication extends Application {

  private FooManager fooManager;

  // Need to leave an empty constructor for other uses
  public MyApplication(){
  }

  public MyApplication(FooManager fooManager){
    this.fooManager = fooManager;
  }

  @Override
  public void run(Configuration configuration, Environment environment) throws Exception {
    if(fooManager == null){
      fooManager = new FooManagerImpl();
    }
    // stuff
  }
}

然后在您的测试中,您创建自己的实例(或者您可以通过复制和修改DropwizardAppCode源代码来创建规则类。编辑:看起来您可以继承DropwizardTestSupport类并覆盖public Application

  @Test
  public void test(){
    FooManager fooManager = mock(FooManager.class);
    MyApplication myApplication = new MyApplication(fooManager);
    myApplication.run("server", "config.yml");
  }

万俟招
2023-03-14

如果你真的想运行一个集成测试,我建议使用一个内存或者临时数据库,比如< code>h2或者< code>sqlite,如果可以的话,通过创建一个带有相关设置的新的yml文件;并使用Wiremock之类的模拟http服务。

否则,按照th3morg的建议,坚持使用< code > resourcestrule 。

 类似资料:
  • 我正在尝试对停靠数据库运行DropWizard的集成测试。 DropWizard 测试容器 我试过的: 我得到由:java.lang.IllegalStateException引起的 将这些链接在一起也不起作用 最后,这是可行的,但据我所知,它在每次测试中都运行新的DropwizardAppRule,这是不好的... 那么,如何将规则链接起来,使PostgreSQLContainer首先启动,并且

  • 我正在尝试将Spring Boot应用程序的一些集成测试从迁移到。目前,测试使用的是 当测试运行时,被配置为使用与服务器运行时相同的基本URL和(随机选择的)端口。 在我的一个测试中,我登录并保存authorization-response头值,以便在后续的API调用中使用。我试着将它迁移到,就像这样 但是当我像这样创建实例时,它没有配置为使用与应用程序相同的端口。 我尝试使用的依赖注入实例 这确

  • Gradle4.6增加了对JUnit5的支持。 只要我没有用于例如集成测试的另一个sourceset,这对我是有效的:我不知道如何在我的集成测试中启用。 我所能做的是让任务与新的JUnit5支持一起工作,但我的任务使用JUnit5控制台并从命令行运行测试。最后,我在gradle中放弃对JUnit5的支持,并回滚到使用JUnit5控制台进行两个测试。 除了之外,如何在其他任务上启用Gradle4.6

  • 集成测试是对已经进行单元测试的各个部分的一种整合测试。集成是昂贵的,并且它出现在测试中。你必须把这个考虑到你的预计和时间表里。 理想情况下,你应该这样组织一个项目,使得最后没有一个阶段是必须通过显式集成来进行的。这比在项目过程中,随着事情完成逐渐集成事情要好得多。如果这是不可避免的,请仔细评估。

  • 使用Spock运行集成测试(例如)的最佳方式是什么?我想引导整个Spring Boot应用程序,并执行一些HTTP调用来测试整个功能。 我可以用JUnit(首先运行应用程序,然后执行测试): 但是有了Spock,应用程序就不会启动了:

  • 我们有一个Spring应用程序,使用Gradle构建,使用Spring Boot 1.2.5运行。释放。我们编写了一些初始集成测试,使用Rest-Assured对Restendpoint进行测试。这起到了作用,我们的应用程序的RESTendpoint通过浏览器和Postman进行了适当的响应。 然后我们使用Spring Security实现了一个OncePerRequest estFilter和我