Hi,

Sorry, I just haven't had a chance to have a look. Probably worth logging
an AspectJ bug in bugzilla so it is appropriately tracked as an issue.

cheers,
Andy


On 17 April 2014 21:44, Eric B <ebenza...@gmail.com> wrote:

> Hi Andy,
>
> Have you had a chance to look at this at the sample application at all (
> https://github.com/benze/AspectJUnitTestError)?  Is this an aspectJ bug
> or a limitation?  Or am I doing something wrong?
>
> Thanks,
>
> Eric
>
>
> On Thu, Apr 10, 2014 at 3:08 PM, Eric B <ebenza...@gmail.com> wrote:
>
>> Hi Andy,
>>
>> I've created a sample application that demonstrates this problem.  I've
>> uploaded it to GitHub.  I pulled this from a working project, but have
>> tried to make it as simple & basic as possible to illustrated the problem.
>>  You can find it here: https://github.com/benze/AspectJUnitTestError.git
>>
>> Basically, the pointcut is supposed to advise any methods in a class that
>> is annotated with my custom annotation and the @Test annotation.  In the
>> *Roo*.aj aspect, a @Test method is crosscut into the class and yet the
>> advice is not called for that method.
>>
>> You can quickly see that the test for the crosscut method fails.
>>
>> Please let me know if you have any questions.
>>
>> Thanks,
>>
>> Eric
>>
>>
>>
>> On Fri, Apr 4, 2014 at 2:17 PM, Andy Clement <andrew.clem...@gmail.com>wrote:
>>
>>> I presume all these aspects are being compiled together with the code.
>>> You shouldn't have to worry about that order the aspects are applied in -
>>> yes there are ITDs but the weaver considers the system as a whole and will
>>> apply the aspects to ITD'd methods as well as existing methods:
>>>
>>> public class Code {
>>>   public void moo(String s) {}
>>> }
>>>
>>> aspect X {
>>>   public void Code.boo(String s) {}
>>> }
>>>
>>> aspect Y {
>>>   before(): execution(* *(String)) {}
>>> }
>>>
>>> > ajc -showWeaveInfo Code.java X.java Y.java
>>>
>>> Join point 'method-execution(void Code.boo(java.lang.String))' in Type
>>> 'X' (X.java:2) advised by before advice from 'Y' (Y.java:2)
>>> Type 'Code' (Code.java) has intertyped method from 'X' (X.java:'void
>>> Code.boo(java.lang.String)')
>>> Join point 'method-execution(void Code.moo(java.lang.String))' in Type
>>> 'Code' (Code.java:2) advised by before advice from 'Y' (Y.java:2)
>>>
>>> Precedence only affects advice, not ITDs. The advice is being applied to
>>> the ITDs, not to what you imagine is happening under the covers (the
>>> methods being stuffed into the target, hence you think you need to get that
>>> done first). All ITDs (and declares) are processed to ensure the type
>>> system is coherent and then the advice is applied.
>>>
>>> I feel like we used to have problems in this area but I thought they
>>> were all fixed up.  Worth raising an AspectJ issue. If you can provide a
>>> simple test case that shows it failing (unlike mine which shows it working)
>>> that would be really useful.  Maybe if any of the annotations you are
>>> triggering on are being applied by declare, try putting them directly on
>>> the methods of interest and temporarily removing the declare - does that
>>> make a difference. It may be the interplay between declare/itd and advice.
>>>
>>> cheers,
>>> Andy
>>>
>>>
>>>
>>> On 3 April 2014 18:37, Eric B <ebenza...@gmail.com> wrote:
>>>
>>>> I'm using Roo and Compile Time Weaving for my application.  One of the
>>>> classes that Roo has generated is my `UserIntegrationTest`:
>>>>
>>>>     @RooIntegrationTest(entity = User.class)
>>>>     @WebAppConfiguration
>>>>     @ActiveProfiles("test")
>>>>     @DirtiesContext
>>>>     @RequiredUserDetails(roles=Role.ROOT)
>>>>     public class UserIntegrationTest {
>>>>     @Test
>>>>     public void myTestMethod(){
>>>>
>>>>     }
>>>>     }
>>>>
>>>>
>>>> Most of the code is all in the Roo generated 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);
>>>>         }
>>>>
>>>>         ...
>>>>         ...
>>>>         ...
>>>>
>>>>     }
>>>>
>>>>
>>>> I've written my own aspect to handle my `@RequiredUserDetails`
>>>> annotation.  My pointcut specifies any `@Test` method in a class that is
>>>> annotated with `@RequiredUserDetails`.  Although the pointcut works fine
>>>> for any methods declared in the main class (ie: `MyTestMethod()`), it does
>>>> not pick up any of the methods in the 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
>>>>             }
>>>>     }
>>>>
>>>>
>>>> I would have expected that given Roo ITDs are being CTW, my aspect
>>>> would apply to those methods as well.  I am presuming that my aspect is
>>>> woven before the Roo aspect and consequently doesn't see Roo's ITDs as part
>>>> of my class.
>>>>
>>>> Is there a way to either ensure that Roo's ITDs are woven before my own
>>>> aspects or to ensure that my pointcut applies to the Roo ITDs as well?
>>>>
>>>> I've tried adding `@DeclarePrecedence` to the top of the aspect, but
>>>> either it is not working as I hoped, or I have it defined incorrectly as it
>>>> has made no difference.
>>>>
>>>>     @Aspect
>>>>     @DeclarePrecedence("**.*Roo*, RequiredUserDetailsAspect")
>>>>     public class RequiredUserDetailsAspect {
>>>>       ...
>>>>       ...
>>>>     }
>>>>
>>>>
>>>> Thanks!
>>>>
>>>> Eric
>>>>
>>>>
>>>> _______________________________________________
>>>> aspectj-users mailing list
>>>> aspectj-users@eclipse.org
>>>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>>>>
>>>>
>>>
>>> _______________________________________________
>>> aspectj-users mailing list
>>> aspectj-users@eclipse.org
>>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>>>
>>>
>>
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@eclipse.org
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>
_______________________________________________
aspectj-users mailing list
aspectj-users@eclipse.org
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to