2016-08-03 31 views
1

ich einen MockMVC Test haben und ich versuche, die Controller-Methode Matcher wie so zu nutzen:‚Kann nicht final Klasse java.lang.String Unterklasse‘, wenn passende Federverschluß 1.4 MockMVC Controller-Methode unter Verwendung von

@Test 
public void environmentTopology() throws Exception { 
    mockMvc.perform(get("/topology/{environmentId}", "envB")) 
      .andExpect(handler().methodCall(on(ManagerController.class) 
       .environmentTopology("envB", true))); 
} 

Diese sollte mir erlauben zu überprüfen, dass die ManagerController environentTopology Methode durch den Test aufgerufen wird. Doch stattdessen erhalte ich die folgende Ausnahme:

java.lang.IllegalArgumentException: Cannot subclass final class java.lang.String 

at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:565) 
at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) 
at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:329) 
at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:492) 
at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:93) 
at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:91) 
at org.springframework.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61) 
at org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34) 
at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:116) 
at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:291) 
at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:480) 
at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:337) 
at org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.initProxy(MvcUriComponentsBuilder.java:611) 
at org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.access$000(MvcUriComponentsBuilder.java:89) 
at org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder$ControllerMethodInvocationInterceptor.intercept(MvcUriComponentsBuilder.java:725) 

Antwort

8

Der Hinweis auf eine Lösung ist hier https://github.com/spring-projects/spring-hateoas/issues/155#issuecomment-36487869

Die Art und Weise das Verfahren zu Link-Funktionalität funktioniert durch einen Proxy für den Rückgabetyp der Schaffung Methode, um den vorherigen Aufruf zu überprüfen. Da es sich bei String um eine letzte Klasse handelt, kann sie per Definition nicht angegeben werden.

Überprüft die Methodensignatur:

@RequestMapping(value = "/topology/{environmentId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public String environmentTopology(@PathVariable("environmentId") String environmentId, ... 

Da es einen String zurückgibt, müssen Sie es in einer Klasse wickeln, die Proxy-fähig ist, wie ResponseEntity

@RequestMapping(value = "/topology/{environmentId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public ResponseEntity<String> environmentTopology(@PathVariable("environmentId") String environmentId, 

Die ResponseEntity Wraps Ihre String Antwort ermöglicht den Testmechanismus zu arbeiten.