2017-04-11 2 views
3

Je me demandais ce que je fais mal en testant ma fonctionnalité d'aspect. L'aspect fonctionne en production (test réussi par QA), mais j'essaie de faire passer mon test d'intégration. Voici mon code:Écrire un test d'intégration pour la fonctionnalité d'aspect au printemps

@Aspect 
@Component 
public class MyAspect { 

@Pointcut("execution(* com.example.dao.UsersDao(..)) && args(.., restrictions)") 
protected void allUsersPointcut(List<String> restrictions) { 

} 

@Around("allUsersPointcut(restrictions)") 
public Object applyUserRestrictions(final ProceedingJoinPoint pjp, List<String> restrictions) throws Throwable { 

    String restrict = "Jack"; 
    restrictions.add(restrict); 

    return pjp.proceed(); 
} 

Ma méthode DAO renvoie juste une liste de tous les utilisateurs, mais quand l'aspect est utilisé, il limite ce que les utilisateurs sont affichés.

@Repository 
UsersDaoImpl implements UsersDao { 
    ... 
} 

Et mon UsersService:

@Service 
public class UsersService implements UsersService { 
    @Autowired 
    protected UsersDAO usersDAO; 

    ... 

    @Transactional(readOnly=true) 
    public List<String> findUsers(List<String> restrictions) { 
    return this.usersDAO.findUsers(restrictions); 
    } 
} 

Dans mon test unitaire que je fais ce qui suit:

@RunWith(SpringJUnit4ClassRunner.class) 
public class UserTest { 

@Autowired 
UsersService usersService; 

@Test 
public void testAspect() { 

    List<String> restrictions = null; 
    List<String> users = this.usersService.findUsers(restrictions); 
    Assert.notNull(users); 
} 

J'ai aussi ajouté le confguration xml:

context:annotation-config></context:annotation-config> 
<aop:aspectj-autoproxy proxy-target-class="true"/> 

<context:component-scan base-package="com.example.aspect" /> 

Quelqu'un peut-il conseiller ce que je fais mal?

+0

Où 'usersDao' est-il déclaré/initialisé dans votre classe de test? – slim

+0

... et à quoi ressemble votre échec de test? Qu'est-ce que 'Assert? '(' Org.junit.Assert' n'a pas de méthode 'notNull()') – slim

+0

@slim Excuses, j'ai édité la classe maintenant pour inclure où j'ai ajouté la déclaration de 'usersDao'. 'org.springframework.util.Assert' a une méthode' notNull() ' –

Répondre

0

D'après ce que je peux voir de votre test, il doit travailler - si vous avez quelques ajustements à faire en ce qui concerne l'analyse de classpath, assurant le test utilise la configuration attendue etc.

Je recommande d'ajouter temporairement:

@Autowired 
ApplicationContext context; 

@Before 
public void dumpBeans() { 
     System.out.println(context.getBeansOfType(UsersDao.class)); 
} 

Ou, plus simplement, System.out.println(usersDao.getClass()) dans la méthode de test.

Vous pouvez également exécuter votre test dans un débogueur - ajoutez un point d'arrêt dans votre classe de test et vérifiez quelle classe est usersDao lors de l'exécution.

+0

Salut @slim, j'ai modifié mon code ci-dessus dans le test pour utiliser la classe de service (d'autres tests d'intégration dans notre application ne les utilisent que) donc je ne suis pas sûr que ça change quelque chose mais je n'ai toujours pas réussi travail. –