Тест Spring Boot Aspectj с MockMvc - PullRequest
       12

Тест Spring Boot Aspectj с MockMvc

2 голосов
/ 06 февраля 2020

У меня есть загрузочный код Spring с Aspectj. Этот код написан с базовой архитектурой c MVC. Тогда я просто пытаюсь проверить это с Mock MVC. Но когда я пытаюсь это проверить, Аспект не прерывается. Существует ли специальная конфигурация для Aspectj?

Контроллер:

@GetMapping("user/{userId}/todo-list")
public ResponseEntity<?> getWaitingItems(@RequestUser CurrentUser currentUser){
    ...handle it with service method.
}

Аспект:

@Pointcut("execution(* *(.., @RequestUser (*), ..))")
void annotatedMethod()
{
}

@Before("annotatedMethod() && @annotation(requestUser)")
public void adviseAnnotatedMethods(JoinPoint joinPoint, RequestUser requestUser)
{
    ...
}

Тест:

@WebMvcTest(value = {Controller.class, Aspect.class})
@ActiveProfiles("test")
@ContextConfiguration(classes = {Controller.class, Aspect.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class ControllerTest
{
    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Autowired
    private Controller controller;

    @MockBean
    private Service service;

    @Before
    public void setUp()
    {
        mockMvc = MockMvcBuilders
                .webAppContextSetup(webApplicationContext)
                .build();
    }

    @Test
    public void getWaitingItems() throws Exception
    {
        mockMvc.perform(get("/user/{userId}/todo-list", 1L))
                .andExpect(status().isOk());
    }
}

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Spring @ WebMvcTest будет только создавать экземпляр веб-слоя и не будет загружать полный контекст приложения

Однако в этом тесте Spring Boot создает экземпляр только веб-слоя а не весь контекст.

Чтобы протестировать Aspectj, вам нужно загрузить весь контекст приложения, используя аннотацию @SpringBootTest

Аннотация @SpringBootTest говорит Spring Boot искать основной класс конфигурации (например, с @SpringBootApplication) и использовать его для запуска контекста приложения Spring

Поэтому аннотируйте тест с помощью @SpringBootTest annotation

@SpringBootTest
@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
public class ControllerTest {

   @Autowired
   private MockMvc mockMvc;

   @Autowired
   private WebApplicationContext webApplicationContext;

   @Autowired
   private Controller controller;

   @Before
   public void setUp() {
    mockMvc = MockMvcBuilders
            .webAppContextSetup(webApplicationContext)
            .build();
      }

    @Test
    public void getWaitingItems() throws Exception  {
    mockMvc.perform(get("/user/{userId}/todo-list", 1L))
            .andExpect(status().isOk());
         }
    }
0 голосов
/ 16 марта 2020

Нет необходимости в @SpringBootTest, если вы хотите провести интеграционные тесты спецификационного контроллера c (веб-слой) + вашей собственной логики Aspect c (слой AOP).

Попробуйте что-то вроде this

@WebMvcTest(controllers = {AnyController.class})
@Import({AopAutoConfiguration.class, ExceptionAspect.class})
public class ErrorControllerAdviceTest {
  • AnyController.class: тестируемый контроллер
  • AopAutoConfiguration.class: автоконфигурация Spring Boot для AOP
  • ExceptionAspect.class: класс, содержащий AOP logi c
@Aspect
@Component
public class ExceptionAspect {}

Протестировано с Spring Boot 2.2.1.RELEASE и JUNIT5. Я не уверен, если мое решение технически такое же, как @Deadpool ответы

...