Как я могу написать утверждение, чтобы убедиться, что мое исключение перехвачено для весеннего класса AOP - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь написать несколько тестов для этого класса, которые должны перехватывать исключения и регистрировать их. Однако, когда я запускаю тесты, они терпят неудачу. Мои тесты показаны ниже. Я не совсем уверен, как тесты должны быть написаны, я только что показал свою попытку здесь. Я пытаюсь добиться того, чтобы аспект, который я настроил, ловил исключение, выполняя JUnit assert. Я также знаю, что правильный метод сопоставляется с помощью pointcut, потому что IntelliJ IDEA переходит к методу, которому сопоставляет pointcut, когда я щелкаю по символу слева от IDE. Имеет ли смысл мой тест, поскольку я новичок в написании тестов для АОП? Кроме того, аспект не вызывается при запуске теста.

interface UserSearch {
    User findUser(long userId); 
    // ...  
}
@Service
public class UserSearchImpl implements UserSearch{
     UserRepository userRepository;

     @Autowired
     UserSearchImpl(UserRepository userRepository){
         this.userRepository = userRepository;
     }

    public User findUser(long userId){
       User user = userRepository.findById(userId);
       if(Objects.isNull(user))){
          throw new UserNotFoundException("User with id "+userId);
       }
    } 
}
@Aspect
@Component 
 public class UserSearchAspect {

  @AfterThrowing(
    pointcut = "execution(* com.isf.services.findUser(..))",
    throwing = "userNotFoundException"
  )
  public void logForUser(JoinPoint joinPoint , UserNotFoundException userNotFoundException) 
  {
  }
}
@ExtendWith({SpringExtension.class , MockitoExtension.class})
@SpringBootTest
public class UserSearchAspectTest {

    @MockBean
    UserRepository userRepository;
    UserSearch userSearch;
    UserSearch proxyService;

    @BeforeEach
    public void setup(){
        userSearch = new UserSearchImpl(userRepository);
        AspectJProxyFactory factory = new AspectJProxyFactory();
        factory.setTarget(userSearch);
        factory.addAspectUserSearchAspect.class);
        proxyService = factory.getProxy();
    }

    @Test //this passes
    public void test(){
        assertTrue(AopUtils.isAopProxy(proxyService));
    }

    @Test
    public void testSome(){
        when(userRepository.findById(123L))
            .thenThrow(new UserNotFoundException("User not found "+123));
        /// How do I assert the exception is caught??
    }
}

1 Ответ

0 голосов
/ 16 марта 2020

Следующий тестовый код может использоваться для проверки

  1. Срабатывание подсказки
  2. Исключение для пользователя не найдено

Надеюсь, это поможет

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import org.aspectj.lang.JoinPoint;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;

@SpringBootTest
class UserSearchTest {

    @MockBean
    UserRepository repository;

    @Autowired
    UserSearch search;

    @SpyBean
    UserSearchAspect aspect;

    @Test
    void test() {
        UserNotFoundException unfEx = new UserNotFoundException("User not found " + 123);
        when(repository.findById(123L)).thenThrow(unfEx);
        Exception exception = assertThrows(UserNotFoundException.class, () -> {
            search.findUser(123L);
        });
        String expectedMessage = "User not found 123";

        // Verify the exception message
        assertTrue(exception.getMessage().contains(expectedMessage));

        ArgumentCaptor<JoinPoint> arg1 = ArgumentCaptor.forClass(JoinPoint.class);
        ArgumentCaptor<UserNotFoundException> arg2 = ArgumentCaptor.forClass(UserNotFoundException.class);
        // Verify the aspect on exception
        verify(aspect, times(1)).logForUser(arg1.capture(), arg2.capture());
        assertTrue(arg2.getValue().getMessage().contains(expectedMessage));
    }

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