2012-08-15 18 views
6

Puede alguien explicar el siguiente escenario
Código ser probado
UserTransaction.java
Junit Mockito cuando (..). ThenReturn() throws NullPointerException

@Override 
public ServiceResponse<User> get(String name) { 
    ServiceResponse<User> response = new ServiceResponse<User>(); 
    List<Map<String, Object>> exp = new ArrayList<Map<String, Object>>(); 
    Map<String, Object> map = new HashMap<String, Object>(); 
    map.put("expression", "eq"); 
    map.put("property", "name"); 
    map.put("value", name); 
    exp.add(map); 
    List<User> users = userDao.getByCriteria(exp); 
    if (!users.isEmpty()) { 
     response.setResponse(users.get(0)); 
    } else { 
     response.setResponse(null); 
    } 
    return response; 
} 

UserDao.java

public List<User> getByCriteria(List<Map<String, Object>> exp) { 
    DetachedCriteria criteria = DetachedCriteria.forClass(User.class); 
    for (Integer i=0;i<exp.size();i++){ 
    String expression = (String) exp.get(i).get("expression"); 
    String property = (String) exp.get(i).get("property"); 
    if(expression.equals("eq"){ 
     criteria.add(Restrictions.eq(property,exp.get(i).get("value"))); 
    } 
    } 
    return hibernateTemplate.findByCriteria(criteria); 
} 

UserTransactionTest.java

private UserTransaction userTransactions = new UserTransaction(); 
private UserDao userDao = mock(UserDao.class); 

@Test 
public void testGet() { 
    User user = new User(); 
    user.setName("Raman"); 
    try { 
     when(userDao.getByCriteria(anyList())).thenReturn(user); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    ServiceResponse<User> response = userTransactions.get("raman"); 
    User result = response.getResponse(); 
    assertEquals("Raman", result.getName()); 
    assertEquals(0, response.getErrors().size()); 
} 

funciona bien.

Pero en lugar de "anyList()" Me pasó una lista definida por el usuario "miLista"

List<Map<String,Object>> myList = new ArrayList<Map<String,Object>>(); 
Map<String,Object> map = new HashMap<String,Object>(); 
map.put("expression","eq"); 
map.put("property","name"); 
map.put("value","raman"); 
myList.add(map); 
when(userTransactions.getByCriteria(myList)).thenReturn(user); 

Lanza NullPointerException en la línea de assertEquals(). ¿Por qué? ¿Qué sucede realmente si se proporciona anyList()?

+0

Eres no publicando suficiente código, lo que dificulta que otros puedan ver dónde estás yendo mal. Es 'cuando (userTransactions' es un error ortográfico ¿Cómo se crea' myList'? ¿Cuál es la firma de método de 'getByCriteria()'? – Brad

+2

¿Me falta algo aquí? Sigues publicando 'cuando (userTransactions ...' y ese objeto no se ha creado. Has creado 'userTransaction' en tu código anterior pero no' userTransactions' (ten en cuenta la "s" al final). Si depuras tu código ¿Existe un objeto llamado 'userTransactions' y es un objeto burlado? – Brad

+0

¿Puedes aclarar si está lanzando la excepción en la línea con' when', o en la línea dentro de la prueba donde 'getByCriteria' se llama realmente? Y publicar algunos más de su código - como han dicho otros, realmente no ha proporcionado suficiente información para que podamos diagnosticar lo que está mal. –

Respuesta

0

creo anyList() es un método que se está burlando y la lista no es un método, puede usted por favor enviar el código fuente para todo lo que está escribiendo este caso de prueba

+2

anyList() es un método de coincidencia en Mockito. –

4

Si el código es completa (Sospecho puede no serlo), entonces no ha especificado el objeto simulado que contiene el método get(). Esto debería estar presente en la llamada a when(...)

estoy esperando código como este ...

UserDao mockDao = mock(UserDao.class); 

when(mockDao.get(list)).thenReturn(users); 
+0

He hecho lo anterior. Pero el problema es cuando paso anyList() como parámetro, la prueba se pasa, pero cuando paso una "lista" definida por el usuario arroja una excepción. – user1600577

0

En primer lugar no está probando UserDao.

A continuación, anyList() produce mockito matcher y debe pasar matcher a userDao.getByCriteria para poder hacer algo, por lo tanto, debe utilizar Matchers.same (su lista) o Matchers.eq (su lista).

La excepción aparece porque, de forma predeterminada, Mockito crea simulacro y, de forma predeterminada, devuelve nulo en cualquier invocación de método inesperada.

4

Estoy seguro de que ya se haya resuelto el problema por ahora, pero en caso de que alguien se tropieza con el mismo problema, aquí está la respuesta:

En el código que ha proporcionado, no está utilizando el burlaste myList que has creado. El método get() siempre llama a userDao.getByCriteria(exp), una variable local.

Es por eso que anyList() funciona, mientras que myList no.

Si haces desea probar la expresión, List<Map<String,Object>> exp debe ser un miembro de su clase, no una variable local:

public class UserTransaction { 
    private List<Map<String,Object>> exp; 

    public UserTransaction() { 
     // creating a default exp value 
     Map<String, Object> map = new HashMap<String, Object>(); 
     map.put("expression", "eq"); 
     map.put("property", "name"); 
     map.put("value", name); 
     exp.add(map); 
    } 

    // getters and setters for exp 

    public ServiceResponse<User> get(String name) { 
     ServiceResponse<User> response = new ServiceResponse<User>(); 
     List<User> users = userDao.getByCriteria(exp); 
     if (!users.isEmpty()) { 
      response.setResponse(users.get(0)); 
     } else { 
      response.setResponse(null); 
     } 
     return response; 
    } 
} 

Y en su ensayo:

private UserTransaction userTransactions = new UserTransaction(); 
private UserDao userDao = mock(UserDao.class); 

@Test 
public void testGet() { 
    User user = new User(); 
    user.setName("Raman"); 

    // creating a custom expression 
    List<Map<String,Object>> myList = new ArrayList<Map<String,Object>>(); 
    Map<String,Object> map = new HashMap<String,Object>(); 
    map.put("expression","eq"); 
    map.put("property","name"); 
    map.put("value","raman"); 
    myList.add(map); 

    // replacing exp with the list created 
    userTransactions.setExp(myList); 
    // return user when calling getByCriteria(myList) 
    when(userDao.getByCriteria(myList)).thenReturn(user); 

    ServiceResponse<User> response = userTransactions.get("raman"); 
    User result = response.getResponse(); 
    assertEquals("Raman", result.getName()); 
    assertEquals(0, response.getErrors().size()); 
} 
Cuestiones relacionadas