Using @WebMvcTest to test a controller that implements an interface and moreover has some annotations like @Secured leads to a falsely used returnValueHandler, namely ModelAttributeMethodProcessor instead of the correct RequestResponseBodyMethodProcessor.

Debugging showed that when the handler is determined the RequestResponseBodyMethodProcessor does not match because it tries to evaluate the @ResponseBody annotation on a proxy instead of the actual Controller class.

If I remove either the interface definition or the @Secured annotation it is working properly. Moreover I've tested this with different Spring Boot versions including 2.4.2, 2.2.0.RELEASE, 2.0.0.RELEASE and 1.5.22.RELEASE

I've prepared and uploaded a small demo application that shows the issue: https://github.com/daviian/spring-webmvctest-interface-bug

EDIT: Issue also appears when using

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc

instead of @WebMvcTest

Comment From: wilkinsona

Duplicates https://github.com/spring-projects/spring-framework/issues/23744. Setting proxyTargetClass = true on @EnableGlobalMethodSecurity fixes the problem.