我正在为我的应用程序使用 Roo 和编译时间编织。Roo 生成的类之一是我的UserIntegrationTest
:
@RooIntegrationTest(entity = User.class)
@WebAppConfiguration
@ActiveProfiles("test")
@DirtiesContext
@RequiredUserDetails(roles=Role.ROOT)
public class UserIntegrationTest {
@Test
public void myTestMethod(){
}
}
大部分代码都在 Roo 生成的 ITD 中:
privileged aspect UserIntegrationTest_Roo_IntegrationTest {
declare @type: UserIntegrationTest: @RunWith(SpringJUnit4ClassRunner.class);
declare @type: UserIntegrationTest: @ContextConfiguration(locations = "classpath*:/META-INF/spring/applicationContext*.xml");
declare @type: UserIntegrationTest: @Transactional;
@Autowired
UserDataOnDemand UserIntegrationTest.dod;
@Autowired
UserService UserIntegrationTest.userService;
@Autowired
UserRepository UserIntegrationTest.userRepository;
@Test
public void UserIntegrationTest.testCountAllUsers() {
Assert.assertNotNull("Data on demand for 'User' failed to initialize correctly", dod.getRandomUser());
long count = userService.countAllUsers();
Assert.assertTrue("Counter for 'User' incorrectly reported there were no entries", count > 0);
}
...
...
...
}
我已经编写了自己的方面来处理我的@RequiredUserDetails
注释。我的切入点指定@Test
了一个类中任何用@RequiredUserDetails
. 尽管切入点适用于主类中声明的任何方法(即:)MyTestMethod()
,但它不会选择 ITD 中的任何方法。
@Aspect
public class RequiredUserDetailsAspect {
/**
* Defines any public <code>@Test</code> method
*/
@Pointcut("execution(public * *(..)) && @annotation(org.junit.Test)")
public void testMethod() {};
/**
* Anything with the {@link RequiredUserDetails} annotation on the method
*/
@Pointcut("@annotation(RequiredUserDetails)")
public void annotatedMethod(){};
/**
* Anything with the {@link RequiredUserDetails} annotation on the class
*/
@Pointcut("@within(RequiredUserDetails)")
public void annotatedClass(){};
@Before("testMethod() && (annotatedClass() || annotatedMethod())")
public void authenticateUser(JoinPoint jp){
// check for any class annotations
}
}
我原以为 Roo ITD 是 CTW,我的观点也适用于这些方法。我假设我的方面是在 Roo 方面之前编织的,因此没有将 Roo 的 ITD 视为我班级的一部分。
有没有办法确保 Roo 的 ITD 在我自己的方面之前编织,或者确保我的切入点也适用于 Roo ITD?
我尝试添加@DeclarePrecedence
到方面的顶部,但要么它没有按我希望的那样工作,要么我没有正确定义它,因为它没有任何区别。
@Aspect
@DeclarePrecedence("**.*Roo*, RequiredUserDetailsAspect")
public class RequiredUserDetailsAspect {
...
...
}