Как исключить аспект в JUnit - PullRequest
0 голосов
/ 25 октября 2018

Мне нужно протестировать метод submitApplication, который находится внутри класса Processor.

@ PreValidate (actionName = "PRE_VALIDATE") в методе submitApplication связан с Aspect (PreValidateAspect), который вызывается автоматически, как и я.проверить метод.Я не хочу, чтобы этот аспект вызывался, так как я хотел бы проверить только те строки, которые внутри функции.

Используемые версии: Spring версия (4.3.16), mockito-core (2.8.47), powermock-api-mockito (2-1.7.0)

Пожалуйста, дайте мне знать, как отключить / исключить этот код аспекта, когда я тестирую функцию.

 public class ProcessorTest {

    @InjectMocks
    private Processor processor;


    @Test
    public void testSubmitApplication() {
        processor.submitApplication();
    }
}



public class Processor {

    @PreValidate(actionName="PRE_VALIDATE")
    public void submitApplication(){
        Long startTime = System.currentTimeMillis();
    }

}


@Aspect
@Component
@Configurable
public class PreValidateAspect {
    @Around("execution(* *(..)) && " +
            "(@annotation(com.PreValidate) " +
            "|| @within(com.PreValidate) )")
    public Object validate(ProceedingJoinPoint joinPoint) throws Throwable{
    }

}

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Один из способов - использовать кодер .

Однако этот подход не сработал для меня.Как уже упоминалось в комментарии.Аспект не может быть осмеянным.Вместо этого вы можете сделать это.

@Aspect
@Component
@Configurable
public class PreValidateAspect {

    @Autowired
    Utils utils;

    @Around("execution(* *(..)) && " +
            "(@annotation(com.PreValidate) " +
            "|| @within(com.PreValidate) )")
    public Object validate(ProceedingJoinPoint joinPoint) throws Throwable{
           if(utils.aspectUtil()) {
              return joinPoint.proceed();
           }
           //else statement
    }

}

public class Utils{
    public Object aspectUtil() {
       //your business logic here
       if(validate()){
           return true;
       }
       return false;
    }
}



public class ProcessorTest {

    @InjectMocks
    private Processor processor;

    @MockBean
    Utils utils;

    @Test
    public void testSubmitApplication() {
        when(utils.validateUtil()).thenReturn(true);
        processor.submitApplication();
    }
}

Этим вы переместите свою бизнес-логику из аспекта в класс и вместо этого смените класс, чтобы вернуть true;

0 голосов
/ 25 октября 2018

Один из вариантов: @ ActiveProfiles с @ Profile

@ActiveProfiles("test")
public class ProcessorTest {

    @InjectMocks
    private Processor processor;


    @Test
    public void testSubmitApplication() {
        processor.submitApplication();
    }
}



public class Processor {

    @PreValidate(actionName="PRE_VALIDATE")
    public void submitApplication(){
        Long startTime = System.currentTimeMillis();
    }

}


@Aspect
@Component
@Configurable
@Profile("!test")
public class PreValidateAspect {
    @Around("execution(* *(..)) && " +
            "(@annotation(com.PreValidate) " +
            "|| @within(com.PreValidate) )")
    public Object validate(ProceedingJoinPoint joinPoint) throws Throwable{
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...