Чтобы активировать полную конфигурацию Spring MVC, вам нужно использовать MockMvcBuilders.webAppContextSetup
вместо MockMvcBuilders.standaloneSetup
.
Ознакомьтесь с этим часть документации Spring для более подробной информации.
Ваш код будет выглядеть так:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration("test-config.xml")
public class ClientQueriesControllerTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@Autowired
private AuthenticationService authenticationService;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public void findAllAccountRelatedClientsUnauthorized() throws Exception {
when(authenticationService.validateAuthorization(anyString())).thenThrow(AuthenticationException.class);
mockMvc.perform(get("/rest/clients").header("Authorization", UUID.randomUUID().toString()))
.andExpect(status().isUnauthorized());
}
}
Затем внутри test-config.xml
вы должны добавить bean-компонент Spring для AuthenticationService
, который является макетом.
<bean id="authenticationService" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="your.package.structure.AuthenticationService"/>
</bean>
Конечно, вы можете использовать профили для внедрения макета AuthenticationService
в тесты, если хотите повторно использовать свой обычный файл конфигурации Spring вместо создания test-config.xml
.
ОБНОВЛЕНИЕ
Немного покопавшись, я обнаружил, что StandaloneMockMvcBuilder
, возвращаемый (MockMvcBuilders.standaloneSetup
), полностью настраивается. Это означает, что вы можете подключить любой преобразователь исключений, который вы предпочитаете.
Однако, поскольку вы используете @ControllerAdvice
, приведенный ниже код не будет работать. Однако, если ваш метод @ExceptionHandler
был внутри того же контроллера, все, что вам нужно было бы изменить, это следующий код:
mockMvc = MockMvcBuilders.standaloneSetup(controller).setHandlerExceptionResolvers(new ExceptionHandlerExceptionResolver()).build();
ОБНОВЛЕНИЕ 2
Еще немного копания дало ответ на то, как вы можете зарегистрировать правильный обработчик исключений, когда вы также используете @ControllerAdvice
.
Вам необходимо обновить код установки в тесте следующим образом:
@Before
public void setUp() throws Exception {
final ExceptionHandlerExceptionResolver exceptionHandlerExceptionResolver = new ExceptionHandlerExceptionResolver();
//here we need to setup a dummy application context that only registers the GlobalControllerExceptionHandler
final StaticApplicationContext applicationContext = new StaticApplicationContext();
applicationContext.registerBeanDefinition("advice", new RootBeanDefinition(GlobalControllerExceptionHandler.class, null, null));
//set the application context of the resolver to the dummy application context we just created
exceptionHandlerExceptionResolver.setApplicationContext(applicationContext);
//needed in order to force the exception resolver to update it's internal caches
exceptionHandlerExceptionResolver.afterPropertiesSet();
mockMvc = MockMvcBuilders.standaloneSetup(controller).setHandlerExceptionResolvers(exceptionHandlerExceptionResolver).build();
}
person
geoand
schedule
01.09.2014
MockMvcBuilders.webAppContextSetup
, как описано в docs.spring.io/spring-framework/docs/current/ вместоMockMvcBuilders.standaloneSetup
? - person geoand   schedule 01.09.2014