gpt4 book ai didi

java - 是否有一种聪明的方法来单元测试 AspectJ 策略执行方面?

转载 作者:行者123 更新时间:2023-12-04 14:45:52 25 4
gpt4 key购买 nike

我有几个应用于我的 Maven src/main/java 目录的 AspectJ 策略实现方面。最近发现了这些方面的一些漏洞,所以想为它们创建单元测试。

我想要做的是在 test 目录(不是由 AspectJ 编译的)中创建 Java 文件,然后以编程方式在选定的文件上调用 AspectJ 编译器并根据结果进行断言。

这样的事情将是完美的:

assertThat("MyJavaClass.java", producesCompilerErrorFor("SomeAspect.aj"));

有没有人做过类似的事情?

最佳答案

像往常一样,这是我自己的答案:

我创建了一个名为 AbstractAspectJPolicyEnforcementTest 的类.其中一些内容是专有信息,但我将向您展示最重要的内容:

protected Matcher<File> producesCompilationErrorWith(final File aspectFile) {
return new AspectJCompilationMatcher(aspectFile, Result.ERROR);
}

private class AspectJCompilationMatcher extends TypeSafeMatcher<File> {
private final File aspectFile;
private final Result expectedResult;
private Result result;

public AspectJCompilationMatcher(final File aspectFile, final Result expectedResult) {
this.aspectFile = aspectFile;
this.expectedResult = expectedResult;
}

@Override
protected boolean matchesSafely(final File javaSourceFile) {
result = compile(javaSourceFile, aspectFile);
return result == expectedResult;
}

@Override
public void describeTo(final Description description) {
description.appendText("compilation result: ").appendValue(result);
}
}

enum Result {
ERROR,
WARNING,
SUCCESS
}

private Result compile(final File javaFileName, final File aspectFile) {

assertExists(javaFileName);
assertExists(aspectFile);

List<String> argList = newArrayList();

// java 7 compatibility
argList.add("-source");
argList.add("1.7");
argList.add("-target");
argList.add("1.7");

// set class path
argList.add("-cp");
argList.add(System.getProperty("java.class.path"));

// add java file
argList.add(javaFileName.getAbsolutePath());

// add aspect files
argList.add(aspectFile.getAbsolutePath());
for (File additionalAspectFile : requiredAspects) {
assertExists(additionalAspectFile);
argList.add(additionalAspectFile.getAbsolutePath());
}

String[] args = argList.toArray(new String[argList.size()]);
List<String> fails = newArrayList();
List<String> errors = newArrayList();
List<String> warnings = newArrayList();
List<String> infos = newArrayList();

// org.aspectj.tools.ajc.Main;
Main.bareMain(args, false, fails, errors, warnings, infos);
if (!fails.isEmpty() || !errors.isEmpty()) {
return Result.ERROR;
} else if (!warnings.isEmpty()) {
return Result.WARNING;
} else {
return Result.SUCCESS;
}
}

这是我在测试类中使用它的方法:
public class ForbiddenPackageNameAspectTest extends AbstractAspectJPolicyEnforcementTest {
@Test
public void testBadPackageName() throws Exception {
assertThat(sourceFile(BadJavaClass.class),
producesCompilationErrorWith(findAspect("ForbiddenPackageNameAspect")));
}

@Test
public void testGoodPackageName() throws Exception {
assertThat(sourceFile(ForbiddenPackageNameAspectTest.class),
compilesWithoutWarningWith(findAspect("ForbiddenPackageNameAspect")));
}
}

当然,在下一步中,我可以扩展它以允许检查特定的错误消息,但一开始就可以这样做。

关于java - 是否有一种聪明的方法来单元测试 AspectJ 策略执行方面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19980876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com