2014-03-04 9 views
23

Ich habe einen Spring MVC-Controller, die Paginierung Unterstützung von Spring-Daten verwendet:Isolieren Controller-Test kann Pageable nicht instanziiert

@Controller 
public class ModelController { 

    private static final int DEFAULT_PAGE_SIZE = 50; 

    @RequestMapping(value = "/models", method = RequestMethod.GET) 
    public Page<Model> showModels(@PageableDefault(size = DEFAULT_PAGE_SIZE) Pageable pageable, @RequestParam(
      required = false) String modelKey) { 

//.. 
     return models; 
    } 

} 

Und ich mag das RequestMapping testen Sie die schöne Spring MVC Testunterstützung verwenden. Um diese Tests schnell und isoliert von allen anderen Sachen los zu halten, möchte ich nicht die komplette Application erstellen:

public class ModelControllerWebTest { 
    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
     ModelController controller = new ModelController(); 
     mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); 
    } 

    @Test 
    public void reactsOnGetRequest() throws Exception { 
     mockMvc.perform(get("/models")).andExpect(status().isOk()); 
    } 

} 

Dieser Ansatz funktioniert gut mit anderen Controllern, die eine Pageable nicht erwarten, aber mit diesem bekomme ich einen dieser schönen langen Spring Stacktraces. Sie wirft in der Lage, über nicht Pageable zu instanziiert:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.data.domain.Pageable]: Specified class is an interface 
at 
.... lots more lines 

Frage: Wie kann ich meinen Test ändern, damit die Magie No-Request-Parameter-To-Pageable Umwandlung ordnungsgemäß geschieht?

Hinweis: In der tatsächlichen Anwendung funktioniert alles gut.

Antwort

29

Das Problem mit Auslagerungsdatei kann durch Bereitstellung eines benutzerdefinierten Argumenthandlers gelöst werden. Wenn dies eingestellt ist, werden Sie in einer ViewResolver Exception (Schleife) ausgeführt. Um dies zu vermeiden, müssen Sie einen ViewResolver (eine anonyme JSON ViewResolver-Klasse zum Beispiel) setzen.

mockMvc = MockMvcBuilders.standaloneSetup(controller) 
      .setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver()) 
      .setViewResolvers(new ViewResolver() { 
       @Override 
       public View resolveViewName(String viewName, Locale locale) throws Exception { 
        return new MappingJackson2JsonView(); 
       } 
      }) 
      .build(); 
16

Gerade @EnableSpringDataWebSupport für Test hinzufügen. Das ist es.

+0

Das ist so gut! –

+1

Ich habe meiner Testklasse die Anmerkung "@ EnableSpringDataWebSupport" hinzugefügt, aber dies hatte keine Auswirkungen. Könntest du etwas mehr darüber sagen, wie das funktionieren soll? -1 für jetzt –

Verwandte Themen