代码之家  ›  专栏  ›  技术社区  ›  StopTheRain

Java+Maven-测试类中的可执行jar

  •  1
  • StopTheRain  · 技术社区  · 7 年前

    我有一个多模块的Selenium项目,它使用页面工厂并通过调用 mvn clean verify...

    我创建了一个JavaFX应用程序,它加载所有套件并允许用户选择一个测试,然后通过上述命令运行该测试。

    我现在面临的问题是,为了加载所有测试类(我在模块依赖项中使用测试jar,以便我在应用程序模块中的测试类可以看到其他模块中的测试),我需要 main 方法在测试类中,而不是在主类中。 显然,这是行不通的,因为jar中不包含测试类。

    我正在寻找一个解决方案,要么在测试类中使用main方法,要么让src/main看到src/test。

    人们提出的建议之一是为测试设置一个单独的模块。但这对我来说不是一个选项,因为我没有权利四处移动测试类或改变那么多项目结构。

    下面是我正在使用的插件:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.package.myapp.Main</mainClass>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <appendAssemblyId>false</appendAssemblyId>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    

    加载套件时,我使用 ClassLoader loader = Thread.currentThread().getContextClassLoader() 得到了一个 ImmutableSet<ClassPath.ClassInfo> 从…起 ClassPath.from(loader).getTopLevelClasses()

    1 回复  |  直到 7 年前
        1
  •  0
  •   Little Santi    7 年前

    这是关于 解耦 模块:您有两个模块:依赖模块和独立模块。您需要从依赖项调用独立项,但不需要在依赖项的编译中包含独立项。

    因此,您可以选择几个选项:

    1. 当编译时知道独立模块的API和协议时。 在这种情况下,您应该设计 界面 为每个独立的API建模。将这些接口发布到单独的库中,并将独立库重新扩展到这些接口。还提供一个工厂,通过动态实例化一组类名(在运行时接收),返回这些接口的对象。

    在依赖模块中,您只需调用工厂即可获得并使用每个接口实现。

    1. 当编译时不知道独立模块的API和协议时。

    呃,呃。。。!我真诚地希望这不是你的情况,因为它不符合标准设计的良好实践。 无论如何,在Java中,您始终可以通过使用 反射 . 虽然我不建议这样做。