rte*_*ove 3 java integration-testing maven-2 unit-testing
作为我当前项目的一部分,我创建了一个自定义类加载器.自定义加载器的部分单元测试涉及使用一些JAR文件来演示加载器的正确行为.
我想在运行实际的单元测试之前从Java源构建测试JAR文件.此外,测试JAR文件在运行单元测试时不能在类路径上,因为我想在测试执行期间动态加载它们.
是否有一种标准模式可以实现这种"在测试阶段之前在一侧构建一些JAR但是将它们排除在类路径之外"的要求?我不敢相信我是第一个尝试用Maven 2做这件事的人,但我似乎无法找到正确的POM结构和依赖关系.通常我最终会在测试阶段之前没有构建一些测试罐,但是我也遇到了不一致的构建顺序问题,这导致构建在一台机器上正常工作,但是无法构建一些测试另一个罐子.
我会尝试在测试中设置测试所需的一切.主要优点是没有神奇的看不见的设置是测试隐含的.测试可以在每个环境中运行.此外,添加新的严格隔离的场景要容易得多,因为您不依赖于某些混合场景设置.
设置不应该太难:
有一种替代方法,它使用java类加载器设计并且无需生成其他类即可工作.
Java有一个类加载器层次结构.每个类加载器都有一个父类加载器.类加载器层次结构的根是引导类加载器.当一个类加载一个类加载器时,它将尝试首先使用父类加载器然后自己加载该类.
您可以使用当前的类加载器加载测试类.将它装罐并使用您自己的类装入器加载它.唯一的区别是您将父类加载器设置为无法加载测试类的加载器.
String resource = My.class.getName().replace(".", "/") + ".class";
//class loader of your test class
ClassLoader myClassLoader = currentThread().getContextClassLoader();
assert ! toList(myClassLoader.getResources(resource)).isEmpty();
//just to be sure that the resource cannot be loaded from the parent classloader
ClassLoader parentClassloader = getSystemClassLoader().getParent();
assert toList(parentClassloader.getResources(resource)).isEmpty();
//your class loader
URLClassLoader myLoader = new URLClassLoader(new URL[0], parentClassloader);
assert toList(myLoader.getResources(resource)).isEmpty();
Run Code Online (Sandbox Code Playgroud)
最简单的方法是设置另一个项目来打包测试jar的类,然后将其设置为正常的测试范围依赖项.
如果您不想/不能这样做,您可以使用程序集插件在process-test-classes
阶段中创建一个jar (即在编译测试之后但在执行测试之前).下面的配置将调用程序集插件来创建classloader-test-deps
在目标目录中该阶段调用的jar .然后,您的测试可以根据需要使用该jar.
程序集插件使用程序集描述符(在src/main/assembly中,称为test-assembly.xml)来打包target/test-classes的内容.我已经设置了一个过滤器来包含com.test包及其子包的内容.这假设您有一些包名称约定,您可以申请jar的内容.
默认情况下,程序集插件将jar作为附加工件附加,通过指定attach
为false,它将不会被安装/部署.
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-2</version>
<executions>
<execution>
<id>create-test-dependency</id>
<phase>process-test-classes</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<finalName>classloader-test-deps</finalName>
<attach>false</attach>
<descriptors>
<descriptor>src/main/assembly/test-assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
这是test-assembly.xml的内容
<assembly>
<id>test-classloader</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.build.testOutputDirectory}</directory>
<outputDirectory>/</outputDirectory>
<!--modify/add include to match your package(s) -->
<includes>
<include>com/test/**</include>
</includes>
</fileSet>
</fileSets>
</assembly>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5470 次 |
最近记录: |