AspectJ les conseils de ne pas être exécutée par le biais de l'unité de test
Je suis perplexe. Je suis en train de tester un AspectJ classe. Mon Aspect classe est ramassé parfaitement quand je suis en cours d'exécution de mon application. Cependant, il me semble être incapable d'obtenir n'importe quel Aspect de la classe d'intercepter tout méthode à l'intérieur d'un test.
Je suis à l'aide de Printemps 3.2.2, AspectJ 1.7.2 et Maven 4.
Voici le test simple, je travaille avec:
Le Test AspectJ classe
package my.package.path.config;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Aspect
public class TestAOP {
private String message;
public TestAOP() {
}
@Pointcut("execution(* my.package.path.TestAOPClient.relayMessage(..))")
public void aopPointcut() {
}
@Around("aopPointcut()")
public String monitor(ProceedingJoinPoint pjp) throws Throwable {
String msg = (String)pjp.proceed();
this.setMessage(msg);
return msg;
}
}
La classe dont la méthode est intercepté
package my.package.path.config;
public class TestAOPClient {
public String relayMessage(String msg) {
return msg;
}
}
La Classe De Test
package my.package.path.config;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
@Configuration
@ContextConfiguration(classes={WebConfig.class})
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("src/main/java")
public class AopConfigTest extends AbstractJUnit4SpringContextTests {
@Bean
public TestAOP testAop() throws Exception {
return new TestAOP();
}
@Test
public void assertTestConfigIsActive() {
TestAOPClient client = new TestAOPClient();
client.relayMessage("hello");
assertThat(((TestAOP)applicationContext.getBean("testAop")).getMessage(), equalTo("hello"));
}
}
Le WebConfig fichier
package my.package.path.web.context;
@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy(proxyTargetClass=false)
@ComponentScan(value={"my.package.path.config", "my.package.path.web"})
public class WebConfig {
}
Invariablement, je reçois l'erreur d'assertion
Expected: "hello" but: was null
Mon WebApplicationContext semble être ramassé, car au moment de l'exécution, je vais obtenir un ApplicationContext échec du chargement de l'erreur si je spécifier une classe qui n'existe pas pour mon Aspect coupe transverse (pointcut).
Ce qui me manque?
OriginalL'auteur Emilie | 2013-06-06
Vous devez vous connecter pour publier un commentaire.
Il est étrange que vous utilisez votre appareil de test aussi comme un
@Configuration
source.Vous devez supprimer le
@Configuration
l'annotation de l'unité de test et de déplacer letestAOP()
bean définition deWebConfig
. Mais plus important encore, le haricot étant conseillé ne doit pas être créé à la main, mais d'ici le Printemps:Mise à jour de config avec le haricot définition:
Si votre objectif était de vérifier si l'AOP configuration fonctionne et
TestAOP
est vraiment un test de haricots (pas juste un mannequin de nom pour cette question), vous pouvez créer un spécialTestConfig
classe de configuration, déplacez le haricot définition et l'utiliser à partir du test de@ContextConfiguration(classes={WebConfig.class,TestConfig.class})
.Oh mon dieu, viens de remarquer que vous êtes la création de la cible bean manuellement dans le test
TestAOPClient client = new TestAOPClient();
... il ne fonctionne pas de cette façon. Le printemps doit être celle qui est la création de la fève! Je vais mettre à jour ma réponse.Réponse de mise à jour.
Doh! Qui a fait le tour. Merci beaucoup!
OriginalL'auteur Pavel Horal
Votre coupe transverse (pointcut) configuration est mauvaise (package doit être mon.package.chemin d'accès.config pour correspondre à votre client de test)
et votre client est
changer à ce
devrait fonctionner.
Merci pour cette réponse. J'ai eu un problème similaire à celui de @Emilie, et mon
@Pointcut
expression était la dernière question m'empêcher de@Before
avis de course!OriginalL'auteur frant.hartm