Sto lavorando un po 'su un codice ereditato. Ho scritto un test che dovrebbe prendere NullPointerException (poiché sta cercando di chiamare un metodo da oggetto null)Mockito quando(). ThenReturn chiama il metodo inutilmente
@Test(expected=NullPointerException.class)
public void checkXRequirement_NullProduct_AddAction_ShouldThrowNullPointerException() throws CustomException {
Site site = mock(Site.class);
Product product = null;
when(BasketHelper.getAction(request)).thenReturn(0);
when(BasketHelper.getActionProduct(site, request)).thenReturn(product);
BasketHelper.requiresX(request, site);
}
relativi metodi e variabili:
public static final int ACTION_ADD = 0;
public static final int ACTION_DELETE = 1;
protected static int getAction(HttpServletRequest a_request) {
String sBuyProduct = a_request.getParameter(ATTRIBUTE_NAME_BUY_PRODUCT);
String sBuyProduct = a_request.getParameter(ATTRIBUTE_NAME_BUY_PRODUCT);
if (sBuyProduct != null) iAction = ACTION_ADD;
else (sDelProduct != null) iAction = ACTION_DELETE;
return iBasketAction
}
protected static Product getActionProduct(Site a_site, HttpServletRequest a_request) {
String sBuyProduct = a_request.getParameter(ATTRIBUTE_NAME_BUY_PRODUCT);
String sDelProduct = a_request.getParameter(ATTRIBUTE_NAME_DEL_PRODUCT);
String sProduct = null;
switch (getBasketAction(a_request)) {
case BASKET_ACTION_ADD:
sProduct = sBuyProduct;
break;
case BASKET_ACTION_DELETE:
sProduct = sDelProduct;
break;
}
int iProductId;
try {
iProductId = Integer.parseInt(sProduct);
} catch (NumberFormatException nbrEx) {
return null;
}
Product prod = getProductById(iProductId);
if (prod.isMasterProduct()) {
prod = getChildProduct(prod, a_site, a_request);
}
return prod;
}
public static boolean requiresX(HttpServletRequest request, Site site) throws CustomException {
try{
if (getAction(request) == ACTION_ADD) {
Product prod = getActionProduct(site, request);
return prod.getType().isRequiredX();
}
} catch(NullPointerException exception) {
log.error("Error Message", exception);
}
return false;
}
Il risultato jUnit della corsa il test è un fallimento con l'analisi dello stack di:
java.lang.Exception: Unexpected exception, expected<java.lang.NullPointerException> but was<org.mockito.exceptions.misusing.WrongTypeOfReturnValue>
Caused by: org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
Integer cannot be returned by getParameter()
getParameter() should return String#
faccio a interpretano male come quando thenReturn dovrebbe funzionare lui(). ri? Voglio solo getAction per restituire 0 e getActionProduct per restituire null ogni volta che viene chiamato. Chiaramente getParameter() viene chiamato e non so perché esattamente.
Puoi mostrare 'getProduct()'? –
In altre notizie .... Posso capire perché scrivere questo tipo di test per replicare un problema. Comunque, il vero test qui dovrebbe essere quello di verificare che se il '' '' product'''' è null il metodo '' '' requireX''' non viene chiamato. A meno che il tuo codice ereditato non stia usando il npe per controllare il flusso del codice?Nel qual caso - strappalo anche tu. – OceanLife
Penso che tu abbia ragione. cambiare la condizione nel metodo requireX è probabilmente una buona idea. –