【问题标题】:Separate ServiceProviders for Unit Testing and Production Code用于单元测试和生产代码的独立服务提供商
【发布时间】:2021-06-05 00:37:49
【问题描述】:

我正在使用 ServiceLoader 来动态加载插件。 为了进行单元测试,我想模拟这些插件的一些行为。 这些模拟插件应该在单元测试时使用,而不是在构建项目时。 但是如何做到这一点?

我觉得这个问题是特定于 IDE/构建工具的,因此我使用的是 Eclipse。

项目结构:

    • 应用程序
      • app.java
    • 刮板
      • ScraperController.java
      • Scraper.java
  • 刮板
  • 测试
    • 样机
      • FailingScraperMock.jar
      • ...
    • unit_tests
      • ServiceLoaderWithProvidedMockScrapersTest.java
      • ...

scraper.Scraper.java 是提供者接口

Scrapers 是所有 Scraper-Providers 的去处

我试图排除源文件夹的模拟插件: src/ 。 要么我做错了,要么这不是我想要做的。

不胜感激任何形式的帮助/信息。

【问题讨论】:

    标签: java eclipse unit-testing plugins serviceloader


    【解决方案1】:

    如果您将测试文件夹 (/tests) 标记为测试代码,则应将其从应用程序构建中排除。

    【讨论】:

    • 测试代码尚未构建。我的问题是我想要仅用于测试和构建特定插件的插件。但是当添加一个仅测试插件时,它也用于我不想要的实际生产代码中
    • 我不明白。您声明您将测试文件夹标记为测试代码,并且不会在生产版本中构建。同时您声明模拟插件确实在生产代码中使用。如果它们甚至没有建成,这怎么可能?
    • 插件作为 jar 文件分发。由 ServiceLoader 动态地 加载,它们不是静态的。通常,将一个目录添加到所有 jar 所在的类路径中,并且服务加载器能够加载它们。但是这样做会将这些插件暴露给测试和生产代码。
    • 你能有两个插件的罐子吗?一个用于真正的插件,一个用于模拟?在这种情况下,您可以针对测试构建和生产构建区别对待它们。
    • 是的,模拟是不同的罐子,但我的问题是如何告诉构建工具,在我的例子中是 eclipse,以不同的方式对待它们。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2019-07-05
    • 2023-01-19
    相关资源
    最近更新 更多