java - Junit mockito when(..).thenReturn() 抛出 NullPointerException

标签 java unit-testing junit mockito

谁能给我解释一下下面的场景
待测代码
用户交易.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;
}   

用户道.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);

assertEquals() 行抛出 NullPointerException。为什么?如果给出 anyList(),实际会发生什么?

最佳答案

我相信您现在已经解决了您的问题,但如果有人偶然发现同样的问题,这里是答案:

在您提供的代码中,您没有使用模拟的 myList你创造了。 get()方法总是调用 userDao.getByCriteria(exp) , 局部变量。

这就是为什么 anyList()有效,而myList没有。

如果您确实想要测试表达式,List<Map<String,Object>> exp应该是你类(class)的成员,而不是局部变量:

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

关于java - Junit mockito when(..).thenReturn() 抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11969609/

相关文章:

silverlight - Silverlight 5 的最佳模拟框架

java - 使用 ORM 时如何松耦合 DB 交互

java - BigInteger 的 .equals() 方法无法正常工作

Java EE 的 CDI 没有按预期工作

java - 为什么 chrome 驱动程序在 @Before 中不起作用?

javascript - 使用 Karma 运行的 Mocha 单元测试 - done() 未定义

java - 为什么在更新大型数组的元素时次要 GC 持续时间会发生如此大的变化?

java - 如果静态类被模拟出来,为什么 PowerMock 会尝试加载 server.xml 文件?

java - 如何使 JUnit assertThat() 使用下限通配符?

文件系统的Java和Junit集成测试