任何人都可以解释下面的情况
要测试的代码
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());
}
工作正常。
但是我没有通过“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);
在NullPointerException
行投掷assertEquals()
。为什么?如果给出anyList()
会发生什么?
答案 0 :(得分:5)
我相信你现在已经解决了你的问题,但如果有人遇到同样的问题,这就是答案:
在您提供的代码中,您没有使用您创建的模拟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());
}
答案 1 :(得分:4)
如果您的代码已完成(我怀疑它可能不是),那么您尚未指定包含get()
方法的模拟对象。这应该出现在对when(...)
我期待这样的代码......
UserDao mockDao = mock(UserDao.class);
when(mockDao.get(list)).thenReturn(users);
答案 2 :(得分:0)
我认为anyList()是一个你正在嘲笑的方法,list不是一个方法,你能不能发表你编写这个测试用例的源代码
答案 3 :(得分:0)
首先,您没有测试UserDao。
接下来,anyList()会生成mockito匹配器,你应该将matcher传递给userDao.getByCriteria才能执行某些操作,因此,您应该使用Matchers.same(您的列表)或Matchers.eq(您的列表)。
出现异常,因为默认情况下Mockito创建了很好的模拟,默认情况下,它们会在任何意外的方法调用时返回null。