2012-08-15 5 views
6

Kann mir jemand das unten stehende Szenario
-Code erklären
UserTransaction.java
Junit Mockito wenn (..). ThenReturn() throws Nullpointer

@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); 
} 
getestet werden

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()); 
} 

funktioniert gut.

Aber statt "anyList()" übergeben ich eine benutzerdefinierte Liste "myList"

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); 

Wirft NullPointerException an der Linie assertEquals(). Warum? Was passiert eigentlich, wenn anyList() angegeben wird?

+0

Du bist nicht genug Code posten, was es für andere schwierig macht, zu sehen, wo du falsch liegst. Ist 'wann (userTransactions.' ein Schreibfehler? Wie wird' myList' erstellt? Was ist die Methodensignatur von 'getByCriteria()'? – Brad

+2

Fehle ich hier etwas? Sie posten '' when (userTransactions ... ''und das Objekt wurde nicht erstellt. Sie haben' userTransaction' in Ihrem obigen Code erstellt, aber nicht 'userTransactions' (beachten Sie das" s "am Ende). Wenn Sie Ihren Code debuggen existiert ein Objekt mit dem Namen 'userTransactions' und es ist ein verspottetes Objekt? – Brad

+0

Können Sie klären, ob es die Exception in der Zeile mit' when' oder in der Zeile innerhalb des Tests auslöst, wo 'getByCriteria' tatsächlich aufgerufen wird? mehr von Ihrem Code - wie andere gesagt haben, haben Sie nicht wirklich genug Informationen zur Verfügung gestellt, damit wir diagnostizieren können, was falsch ist –

Antwort

0

Ich denke anyList() ist eine Methode, die Sie verspotten und die Liste ist keine Methode, können Sie bitte den Quellcode veröffentlichen für was auch immer Sie diesen Testfall schreiben

+2

anyList() ist eine Matcher-Methode in Mockito –

4

Wenn Ihr Code abgeschlossen ist (ich vermute, Dies ist möglicherweise nicht der Fall). Sie haben das Mock-Objekt, das die get()-Methode enthält, nicht angegeben. Dies sollten Sie im Aufruf von when(...)

Ich erwarte Code wie diesen ...

UserDao mockDao = mock(UserDao.class); 

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

Ich habe wie oben getan, aber das Problem Wenn ich anyList() als Parameter übergebe, wird der Test übergeben, aber wenn ich eine benutzerdefinierte "Liste" übergebe, wird Exception ausgelöst. – user1600577

0

Zunächst einmal vorhanden sein nicht UserDao testen.

Als nächstes produzieren anyList() Mockito Matcher und Sie sollten Matcher an userDao.getByCriteria übergeben, um etwas zu tun, so sollten Sie Matchers.same (Ihre Liste) oder Matchers.eq (Ihre Liste) verwenden.

Die Ausnahme wird angezeigt, weil Mockito standardmäßig einen netten Schein erstellt und standardmäßig bei einem unerwarteten Methodenaufruf null zurückgibt.

4

Ich bin sicher, Sie haben bereits Ihr Problem mittlerweile gelöst, aber falls jemand stolpert auf dem gleichen Problem, hier ist die Antwort:

Im Code, den Sie zur Verfügung gestellt haben, verwenden Sie nicht die nachgeahmten myList Sie haben erstellt. Die get() Methode ruft immer userDao.getByCriteria(exp), eine lokale Variable.

Dies ist, warum anyList() funktioniert, während myList nicht funktioniert.

Wenn Sie den Ausdruck testen wollen, List<Map<String,Object>> exp ein Mitglied Ihrer Klasse sein sollte, nicht eine lokale Variable:

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; 
    } 
} 

Und in Ihrem Test:

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()); 
} 
Verwandte Themen