Aby aktywować pełną konfigurację Spring MVC, należy użyć MockMvcBuilders.webAppContextSetup
zamiast MockMvcBuilders.standaloneSetup
.
Aby uzyskać więcej informacji, zapoznaj się z częścią Dokumentacja sprężynowa pod numerem this.
Twój kod będzie wyglądać następująco:
@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());
}
}
Następnie wewnątrz test-config.xml
byś dodać Wiosna fasoli dla AuthenticationService
że jest fałszywa.
<bean id="authenticationService" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="your.package.structure.AuthenticationService"/>
</bean>
Można profili ruchu oczywiście wstrzyknąć mock AuthenticationService
w testach jeśli chcesz ponownie użyć zwykły plik konfiguracyjny Wiosna zamiast tworzyć test-config.xml
.
UPDATE
Po wykopaniu się trochę, to okazało się, że StandaloneMockMvcBuilder
zwrócony przez (MockMvcBuilders.standaloneSetup
) jest w pełni konfigurowalny. Oznacza to, że możesz podłączyć dowolny preferowany wyjątek.
Ponieważ jednak używasz @ControllerAdvice
, poniższy kod nie będzie działać. Jeśli wszystko trzeba by zmienić jednak metoda @ExceptionHandler
był wewnątrz samego kontrolera kod jest następujący:
mockMvc = MockMvcBuilders.standaloneSetup(controller).setHandlerExceptionResolvers(new ExceptionHandlerExceptionResolver()).build();
UPDATE 2
Niektóre bardziej kopanie dał odpowiedź na to, jak można zarejestrować prawidłową procedurę obsługi wyjątku, gdy używasz także @ControllerAdvice
.
Musisz zaktualizować kod instalacyjny w teście na następujące kwestie:
@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();
}
Czy próbowałeś opcji 'MockMvcBuilders.webAppContextSetup' jak opisano na http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/testing.html#spring-mvc-test- framework zamiast 'MockMvcBuilders.standaloneSetup'? – geoand