DATAREST-1193 - DelegatingHandlerMapping is now a MatchableHandlerMapping.

DelegatingHandlerMapping now implements MatchableHandlerMapping by selecting the a delegate based on the already implemented algorithm and then invoking the ….match(…) method in case the selected one is a MatchableHandlerMapping in turn.

Refactored the internals a bit to be able to reuse the selection algorithm from both ….getHandler(…) and ….match(…).
This commit is contained in:
Oliver Gierke
2018-02-19 18:00:59 +01:00
parent 4dd66ba782
commit 622cf07720
2 changed files with 93 additions and 18 deletions

View File

@@ -17,6 +17,7 @@ package org.springframework.data.rest.webmvc.support;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.util.Arrays;
@@ -25,12 +26,15 @@ import javax.servlet.http.HttpServletRequest;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.UnsatisfiedServletRequestParameterException;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.handler.MatchableHandlerMapping;
import org.springframework.web.servlet.handler.RequestMatchResult;
/**
* Unit tests for {@link DelegatingHandlerMapping}.
@@ -38,7 +42,7 @@ import org.springframework.web.servlet.HandlerMapping;
* @author Oliver Gierke
* @soundtrack Benny Greb - Stabila (Moving Parts)
*/
@RunWith(MockitoJUnitRunner.class)
@RunWith(MockitoJUnitRunner.Silent.class)
public class DelegatingHandlerMappingUnitTests {
@Mock HandlerMapping first, second;
@@ -54,6 +58,24 @@ public class DelegatingHandlerMappingUnitTests {
assertHandlerTriedButExceptionThrown(mapping, UnsatisfiedServletRequestParameterException.class);
}
@Test // DATAREST-1193
public void exposesMatchabilityOfSelectedMapping() {
// Given:
// A matching mapping that doesn't get selected
MatchableHandlerMapping third = mock(MatchableHandlerMapping.class);
doReturn(mock(RequestMatchResult.class)).when(third).match(any(), any());
// A matching mapping that gets selected
RequestMatchResult result = mock(RequestMatchResult.class);
MatchableHandlerMapping fourth = mock(MatchableHandlerMapping.class, Answers.RETURNS_MOCKS);
doReturn(result).when(fourth).match(any(), any());
DelegatingHandlerMapping mapping = new DelegatingHandlerMapping(Arrays.asList(first, second, third, fourth));
assertThat(mapping.match(request, "somePattern")).isEqualTo(result);
}
private final void assertHandlerTriedButExceptionThrown(HandlerMapping mapping, Class<? extends Exception> type)
throws Exception {