2017-05-09 4 views
0

J'écris un test pour RequestContextHolder. J'ai réussi les tests, mais après avoir été refactorisé, j'ai obtenu NullPointerException, mais je n'arrive pas à comprendre pourquoi.Le test Java Spring RequestContext lève NullPointerException même avec MockHttpServletRequest

Voici le code.

String processorName = "<UNKNOWN>".intern(); 
    Optional<HttpServletRequest> request = Optional.of(((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()); 
    String procName = (String) request.get().getAttribute(CONTROLLER_NAME); 

    if (!Strings.isEmpty(procName)) { 
     processorName = procName; 
    } 

    return processorName; 

Et voici mes tests

@Test 
public void testProcessorName() throws Exception { 
    MockHttpServletRequest request = new MockHttpServletRequest(); 
    request.setAttribute(CONTROLLER_NAME, "default"); 
    RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); 

    String processorName = halUtils.processorName(); 
    assertEquals("default", processorName); 
} 

@Test 
public void testProcessorNameWithoutAttribute() throws Exception { 
    MockHttpServletRequest request = new MockHttpServletRequest(); 
    RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); 

    String processorName = halUtils.processorName(); 
    assertEquals("<UNKNOWN>", processorName); 
} 

@Test 
public void testProcessorNameWithoutRequest() throws Exception { 
    String processorName = halUtils.processorName(); 
    assertEquals("<UNKNOWN>", processorName); 
} 

Je refactorisé être une seule ligne, mais je suis arrivé à la place NullPointerException.

public String processorName() { 
    return Optional.of(((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest().getAttribute(CONTROLLER_NAME)).orElse("<UNKNOWN>".intern()).toString(); 
} 

Répondre

0

Ce que vous faites est essentiellement:

return Optional.of(null).orElse("<UNKNOWN>".intern()).toString(); 

Cela vous donnera un NullPointerException, parce que le retour de getAttribute(CONTROLLER_NAME) est nul et Optional.of(..) n'accepte pas les paramètres nuls, alors que dans votre code d'origine , vous étiez en train de tester sa valeur avec Strings.isEmpty(..).