Java 如何动态地为JUnit测试提供工具?

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); ..

在上下文开始之前,我使用Invesdwin()在main方法中将java代理动态加载到Spring Boot项目中:

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()