@AuthenticationPrincipal
으로 주석 된 매개 변수로 UserDetails
을받는 나머지 끝점을 테스트하는 데 문제가 있습니다. 스프링 REST 컨트롤러를 단위 테스트 할 때 @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
을 사용하고 있습니다.
[다음 안내를 따르십시오] (http://docs.spring.io/spring-security) /site/docs/4.0.x/reference/htmlsingle/#test-mockmvc). – OrangeDog
그래서 인증과 결합 된 standaloneSetup을 사용할 방법이 없습니까? – andrucz
어디서 그런 말입니까? – OrangeDog