像往常一樣,這是我自己的答案:
我創建了一個名爲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")));
}
}
當然,我可以擴展它以允許檢查特定的錯誤消息,但是一開始這將會執行。
如果你在windows上,ajc是一個批處理文件。只需查看該命令行並執行即可。認爲你需要的只是classpath上的ajtools.jar,但我忘記了主類的名字。 – aepurniet
沒有選項。測試必須在許多不同平臺上的許多不同計算機上運行,而不需要任何人在本地安裝ajc –
如何在沒有aspectj編譯器的情況下編譯SomeAspect.aj? – aepurniet