Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: RES: [aspectj-users] How to?

For getting the test method name, you will want to advice TestCase+.test*(), and store away the thisJoinPointStaticPart somewhere (preferable in a ThreadLocal -- but since testing happens from a single thread, a static variable somewhere, say in the aspect, may be sufficient). Then use that variable in advice to CatalogoProdutos.getEspecificacao(int).

Luckily (in this case) you can call testCase.getName(). Junit does you the favor of storing the test method name in an instance variable.

Cheers,

Nicholas Lesiecki
Software Craftsman, specializing in J2EE,
Agile Methods, and aspect-oriented programming
m: 520 591-1849

Books:
* Mastering AspectJ: http://tinyurl.com/66vf
* Java Tools for Extreme Programming: http://tinyurl.com/66vt

Articles on AspectJ:
* http://tinyurl.com/66vu and http://tinyurl.com/66vv
On Sep 13, 2004, at 8:10 PM, Ramnivas Laddad wrote:

Adre,

Here is the aspect that does work; some parenthesis weren't correctly placed in my original solution. You should refactor the testsFlow() pointcut to make it more understandable.

package analizer;

import pdv.*;
import junit.framework.TestCase;

public aspect DepedenceAnalizer {
 pointcut testsFlow(TestCase testCase) :
execution(EspecificacaoProduto CatalogoProdutos.getEspecificacao(int)) &&
     cflow((execution (* junit.framework.TestCase+.test*())) &&
     this(testCase));
  before(TestCase testCase) : testsFlow(testCase) {
   System.out.println(testCase.getClass());
 }
}

For getting the test method name, you will want to advice TestCase+.test*(), and store away the thisJoinPointStaticPart somewhere (preferable in a ThreadLocal -- but since testing happens from a single thread, a static variable somewhere, say in the aspect, may be sufficient). Then use that variable in advice to CatalogoProdutos.getEspecificacao(int).

-Ramnivas

===
Ramnivas Laddad,
Author, AspectJ in Action
http://ramnivas.com



André Dantas Rocha wrote:

Thanks Ramnivas,

But still not working... Now, my pointcut picks nothing...

My program is attached (Eclipse project).

PDVTest.testeEntrarItem() calls PDV.entrarItem(int,int) that calls
CatalogoProdutos.getEspecificacao(int) that must me intercepted.

In addition it possible to get the caller 'test' method too? (in this case
testeEntrarItem)

Thanks,

André



-----Mensagem original-----
De: aspectj-users-admin@xxxxxxxxxxx [mailto:aspectj-users-admin@xxxxxxxxxxx]
Em nome de Ramnivas Laddad
Enviada em: segunda-feira, 13 de setembro de 2004 22:07
Para: aspectj-users@xxxxxxxxxxx
Assunto: Re: [aspectj-users] How to?

Use the following aspect:

public aspect Analizer {
 pointcut testsFlow(TestCase testCase) :
     call(* MyClass.myMethod(..)) &&
     cflow(execution (* junit.framework.TestCase+.test*()) &&
this(testCase));
  before(TestCase testCase) : testsFlow(testCase) {
   System.out.println(testCase.getClass());
 }
}

And you have just used the wormhole design pattern!

-Ramnivas

===
Ramnivas Laddad,
Author, AspectJ in Action
http://ramnivas.com



André Dantas Rocha wrote:


Hi,
I'd like to print the TestCase name from witch myMethod is called (not directly, but in the TestCase control-flow). Is it possible via pointcut declaration? my code is shown below... public class MyClass {
 void xx() { myMethod(); }
 void myMethod() {...}
}
public void testM() {
 new MyClass().xx();
}
public aspect Analizer {
 pointcut testsFlow() :
     call(* MyClass.myMethod(..)) &&
     cflow(execution (* junit.framework.TestCase+.test*()));
  before() : testsFlow() {
System.out.println(thisJoinPoint); // not working, must print "testM"...
 }
}
Thanks,
André


_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users




Back to the top