2012-08-15 17 views
6

फेंकता है किसी को भी मुझे नीचे परिदृश्य
कोड की व्याख्या कर सकते परीक्षण किया जाना
UserTransaction.java
JUnit mockito जब (..)। ThenReturn() 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); 
} 

उपयोगकर्ताTransactionTest.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()); 
} 

ठीक काम करता है।

लेकिन बजाय "anyList()" मैं एक उपयोगकर्ता-निर्धारित सूची "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); 

फेंकता लाइन assertEquals() पर NullPointerException पारित कर दिया। क्यूं कर? वास्तव में क्या होता है यदि anyList() दिया गया है?

+0

तुम पर्याप्त कोड पोस्ट नहीं करना जिससे दूसरों को यह देखना मुश्किल हो जाता है कि आप कहां गलत हो रहे हैं। क्या 'जब (userTransactions.' एक वर्तनी गलती है?' MyList' कैसे बनाया जा रहा है? 'GetByCriteria() 'का विधि हस्ताक्षर क्या है? – Brad

+2

क्या मुझे यहां कुछ याद आ रही है? आप 'जब (userTransactions ...' पोस्ट करते रहते हैं और वह ऑब्जेक्ट नहीं बनाया गया है। आपने उपरोक्त कोड में 'userTransaction' बनाया है, लेकिन' उपयोगकर्ता ट्रांज़ेक्शन 'नहीं है (अंत में "s" को नोट करें)। यदि आप अपना कोड डीबग करते हैं क्या 'userTransactions' नामक ऑब्जेक्ट मौजूद है और यह एक मॉक ऑब्जेक्ट है? – Brad

+0

क्या आप स्पष्टीकरण दे सकते हैं कि यह' कब 'के साथ लाइन पर अपवाद फेंक रहा है या परीक्षण के भीतर की रेखा पर जहां' GetCyrititeria 'वास्तव में कहा जाता है? और कुछ पोस्ट करें आपके कोड का अधिक - जैसा कि अन्य ने कहा है, आपने वास्तव में पर्याप्त जानकारी प्रदान नहीं की है ताकि हमें गलत क्या पता चल सके। –

उत्तर

0

मुझे लगता है कि anyList() एक तरीका है जिसके आप मजाक और सूची रहे हैं एक तरीका नहीं है, तो आप स्रोत कोड जो कुछ के लिए आप इस परीक्षण का मामला

+2

कोई भी सूची() मॉकिटो में एक मैचर विधि है। –

4

अपने कोड पूरा हो गया है, तो लिख रहे हैं पोस्ट करें कर सकते हैं (मुझे लगता है यह नहीं हो सकता है) तो आपने मॉक ऑब्जेक्ट निर्दिष्ट नहीं किया है जिसमें get() विधि शामिल है। यह when(...)

मैं इस तरह कोड की उम्मीद कर रहा हूँ करने के लिए कॉल में उपस्थित होना चाहिए ...

UserDao mockDao = mock(UserDao.class); 

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

मैंने ऊपर जैसा किया है। लेकिन समस्या जब मैं किसी भी सूची() को पैरामीटर के रूप में पास करता हूं तो परीक्षण पास हो जाता है लेकिन जब मैं उपयोगकर्ता की परिभाषित "सूची" पास करता हूं तो यह अपवाद फेंकता है। – user1600577

0

आप UserDao परीक्षण नहीं कर रहे हैं सबसे पहले।

अगला, कोई भी सूची() मॉकिटो मैचर का उत्पादन करती है और आपको कुछ करने के लिए उपयोगकर्ता Dao.getByCriteria में मैचर पास करना चाहिए, इसलिए, आपको Matchers.same (आपकी सूची) या Matchers.eq (आपकी सूची) का उपयोग करना चाहिए।

अपवाद प्रकट होता है क्योंकि डिफ़ॉल्ट रूप से मॉकिटो अच्छा मॉक बनाता है और डिफ़ॉल्ट रूप से वे किसी भी अप्रत्याशित विधि आमंत्रण पर शून्य वापस लौटते हैं।

4

मुझे यकीन है कि आप पहले से ही अब तक आपकी समस्या को हल किया गया है, लेकिन इस मामले में किसी को भी एक ही मुद्दे पर ठोकर, यहाँ जवाब है:

कोड आपके द्वारा दिए गए में, आप उपयोग नहीं कर रहे मज़ाक उड़ाया myList आपने बनाया है। get() विधि हमेशा एक स्थानीय चर userDao.getByCriteria(exp) पर कॉल करती है।

यही कारण है कि anyList() काम करता है, जबकि myList नहीं करता है।

आप अभिव्यक्ति का परीक्षण करना चाहते हैं हैं, तो List<Map<String,Object>> exp अपने वर्ग के एक सदस्य, नहीं एक स्थानीय चर होना चाहिए:

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

और अपने परीक्षण में:

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