Java 如何动态地为JUnit测试提供工具?
在上下文开始之前,我使用Invesdwin()在main方法中将java代理动态加载到Spring Boot项目中:Java 如何动态地为JUnit测试提供工具?,java,spring-boot,junit4,main,load-time-weaving,Java,Spring Boot,Junit4,Main,Load Time Weaving,在上下文开始之前,我使用Invesdwin()在main方法中将java代理动态加载到Spring Boot项目中: DynamicInstrumentationLoader.waitForInitialized(); DynamicInstrumentationLoader.initLoadTimeWeavingContext(); ApplicationContext springContext = SpringApplication.run(Some_Service.class); ..
DynamicInstrumentationLoader.waitForInitialized();
DynamicInstrumentationLoader.initLoadTimeWeavingContext();
ApplicationContext springContext = SpringApplication.run(Some_Service.class);
...
这非常有效,因为它消除了从命令行运行java-jar命令时添加-javaagent参数的需要
当涉及到单元测试时,问题就出现了。因为它们没有main方法(我可以利用它),所以我不能在Spring上下文初始化之前运行这两行。如果没有这些参数,每个测试都会导致加载上下文失败,并出现以下错误:
ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:spring-instrument-{version}.jar
在最终构建期间,我可以通过在POM中以这种方式设置Surefire插件来解决此问题:
<!--Maven Surefire Plugin-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
<configuration>
<argLine>
-javaagent:lib/aspectjweaver-1.9.5.jar
-javaagent:lib/spring-instrument-5.2.3.RELEASE.jar
</argLine>
</configuration>
</plugin>
在运行JUnit测试时,是否有一种已知的方法来复制在主方法中运行的代码
******编辑******
我注意到这件事非常奇怪。如果我以JUnit测试的形式运行包含测试的包,它就可以工作了!只有在Eclipse中将src/test/java文件夹作为JUnit测试运行或将应用程序本身作为JUnit测试运行(我最终需要)时,才会出现上述编织错误。动态编织正在工作,但不知何故,只有在运行单个测试或直到作为JUnit测试的封装包时,它才起作用。我希望这是有道理的
我开始怀疑我的aop.xml文件有问题,但是如果运行单个测试甚至整个包都可以正常工作,那怎么可能是问题呢 我知道Eclipse中的AspectJ支持(AJDT)在大多数方面都比IntelliJ IDEA中好,但仍然存在一些问题,并且由于缺乏人力而缺乏维护。我通常静态编译我的方面或者使用编织代理,而不是动态编织器附件,因为它对类加载的顺序很敏感。但您可以尝试编写自己的测试JUnit runner。无论如何,为了重现和分析您的问题,最好使用GitHub。我们最终可能会得到一个解决方案和/或Eclipse错误通知单。我上面的WeavingRunner类在编写我自己的检测runner时(做得很差),但在某些场景中,某些东西在时间方面表现得不好。我将试着整理一个完整的例子。
public class WeavingRunner extends SpringJUnit4ClassRunner
{
public WeavingRunner(Class<?> clazz) throws InitializationError
{
super(clazz);
DynamicInstrumentationLoader.waitForInitialized();
DynamicInstrumentationLoader.initLoadTimeWeavingContext();
}
}
java.lang.NoSuchMethodException: com.something.SomeAspectClass.aspectOf()