Ich habe Probleme beim Testen eines Rest-Endpunkts, der einen als Parameter empfängt, der mit @AuthenticationPrincipal
gekennzeichnet ist.Inject @AuthenticationPrincipal beim Unit-Testen eines Spring-REST-Controllers
scheint, wie die Benutzerinstanz im Testszenario erstellt nicht verwendet wird, sondern ein Versuch unter Verwendung von Standard-Konstruktor instanziiert wird stattdessen gemacht: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.andrucz.app.AppUserDetails]: No default constructor found;
REST-Endpunkt:
@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));
...
};
}
}
Prüfklasse:
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());
}
}
Wie kann ich dieses Problem lösen, ohne auf webAppContextSetup
umschalten zu müssen? Ich würde gerne Tests schreiben, die die volle Kontrolle über Service-Mocks haben, also verwende ich standaloneSetup
.
Sie müssen [folgen Sie diesen Anweisungen] (http://docs.spring.io/spring-security /site/docs/4.0.x/reference/htmlsingle/#test-mockmvc). – OrangeDog
Also gibt es keine Möglichkeit, StandaloneSetup in Kombination mit Authentifizierung zu verwenden? – andrucz
Wo sagt es das? – OrangeDog