2016-02-10 8 views
5

Abbiamo alcuni controllore, dire qualcosa del genere:Test di integrazione MVC primaverile - come cercare richiesta Percorso di mappatura?

@Controller 
@RequestMapping("/api") 
public Controller UserController { 

    @RequestMapping("https://stackoverflow.com/users/{userId}") 
    public User getUser(@PathVariable String userId){ 
     //bla 
    } 
} 

Abbiamo un test di integrazione per questo, dicono:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@SpringApplicationConfiguration(classes= MyApp.class) 
@IntegrationTest("server:port:0") 
public class UserControllerIT { 

    @Autowired 
    private WebApplicationContext context; 

    @Test 
    public void getUser(){ 
     test().when() 
       .get("/api/users/{userId}", "123") 
       .then() 
       .statusCode(200); 
    } 
} 

come possiamo evitare duro codifica le "/ API/utenti/{ userId} "nel test? Come possiamo cercare la requestmapping per nome. La mappatura richiesta sopra deve avere un nome predefinito di UC# getUser

L'unica cosa che ho visto è qualcosa come MvcUriComponentsBuilder, che sembra richiedere che sia usato nel contesto di una richiesta (quindi sarebbe usato in .jsps per generare URL per i controller).

Qual è il modo migliore per gestire questo? Devo esporre i mapping come stringhe statiche sui controller? Preferirei almeno evitarlo.

+0

Se non si desidera utilizzare la mappatura, è possibile utilizzare la classe e il nome del metodo e la riflessione per esaminare l'annotazione ed estrarre la mappatura. – DavidA

risposta

1

ho finito per fare come suggerito @DavidA e solo utilizzando la riflessione:

protected String mapping(Class controller, String name) { 
    String path = ""; 
    RequestMapping classLevel = (RequestMapping) controller.getDeclaredAnnotation(RequestMapping.class); 
    if (classLevel != null && classLevel.value().length > 0) { 
     path += classLevel.value()[0]; 
    } 
    for (Method method : controller.getMethods()) { 
     if (method.getName().equals(name)) { 
      RequestMapping methodLevel = method.getDeclaredAnnotation(RequestMapping.class); 
      if (methodLevel != null) { 
       path += methodLevel.value()[0]; 
       return url(path); 
      } 
     } 
    } 
    return ""; 
} 

Non so quante volte lo useremo, ma questo è il il meglio che ho potuto trovare.

Utilizzo in una classe di test:

when().get(mapping(UserAccessController.class, "getProjectProfiles"), projectId) 
      .then().assertThat().body(....); 
3

Qualcosa di simile:

URI location = MvcUriComponentsBuilder.fromMethodCall(on(UserController.class).getUser("someUserId").build().toUri(); 
+0

Grazie. Ho cercato di evitare ciò a causa della necessità di fornire argomenti sul metodo (anche se non devono essere validi). Ora sono secondo a indovinarmi ... – Dan

Problemi correlati