【发布时间】:2012-08-15 12:52:49
【问题描述】:
谁能解释一下下面的场景
要测试的代码
UserTransaction.java
@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());
}
工作正常。
但是我传递了一个用户定义的列表“myList”而不是“anyList()”
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(),实际会发生什么?
【问题讨论】:
-
您没有发布足够多的代码,导致其他人很难看到您哪里出错了。
when(userTransactions.是拼写错误吗?myList是如何创建的?getByCriteria()的方法签名是什么? -
我在这里遗漏了什么吗?您继续发布
when(userTransactions...并且该对象尚未创建。您在上面的代码中创建了userTransaction,但没有创建userTransactions(注意末尾的“s”)。如果您调试代码,是否存在名为userTransactions的对象并且它是一个模拟对象? -
您能否澄清它是在
when的行上抛出异常,还是在实际调用getByCriteria的测试行上抛出异常?并发布更多代码 - 正如其他人所说,您还没有真正提供足够的信息来让我们能够诊断出问题所在。
标签: java unit-testing junit mockito