Введите @AuthenticationPrincipal при модульном тестировании контроллера Spring REST

У меня возникли проблемы при попытке проверить конечную точку отдыха, которая получаетUserDetails в качестве параметра, помеченного@AuthenticationPrincipal.

Похоже, пользовательский экземпляр, созданный в тестовом сценарии, не используется, но вместо этого делается попытка создать экземпляр с использованием конструктора по умолчанию:org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.andrucz.app.AppUserDetails]: No default constructor found;

Конечная точка REST:

@RestController
@RequestMapping("/api/items")
class ItemEndpoint {

    @Autowired
    private ItemService itemService;

    @RequestMapping(path = "/{id}",
                    method = RequestMethod.GET,
                    produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Callable<ItemDto> getItemById(@PathVariable("id") String id, @AuthenticationPrincipal AppUserDetails userDetails) {
        return () -> {
            Item item = itemService.getItemById(id).orElseThrow(() -> new ResourceNotFoundException(id));
            ...
        };
    }
}

Тестовый класс:

public class ItemEndpointTests {

    @InjectMocks
    private ItemEndpoint itemEndpoint;

    @Mock
    private ItemService itemService;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.standaloneSetup(itemEndpoint)
                .build();
    }

    @Test
    public void findItem() throws Exception {
        when(itemService.getItemById("1")).thenReturn(Optional.of(new Item()));

        mockMvc.perform(get("/api/items/1").with(user(new AppUserDetails(new User()))))
                .andExpect(status().isOk());
    }

}

Как я могу решить эту проблему, не переключаясь наwebAppContextSetup? Я хотел бы написать тесты, имеющие полный контроль над макетами службы, поэтому я используюstandaloneSetup.

Ответы на вопрос(4)

Ваш ответ на вопрос