web-dev-qa-db-ja.com

Junit mockito when(..)。thenReturn()がNullPointerExceptionをスローする

誰かが私に以下のシナリオを説明できますか
テストするコード
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);
_

assertEquals()行にNullPointerExceptionをスローします。どうして? anyList()が指定された場合、実際にはどうなりますか?

7
user1600577

あなたはすでにあなたの問題を解決していると確信していますが、誰かが同じ問題に遭遇した場合に備えて、ここに答えがあります:

提供したコードでは、作成したモックのmyListを使用していません。 get()メソッドは、常にローカル変数userDao.getByCriteria(exp)を呼び出します。

これが、anyList()が機能するのに対し、myListは機能しない理由です。

do式をテストしたい場合は、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());
}
5
Tarek

コードが完成している場合(そうではないかもしれません)、get()メソッドを含むモックオブジェクトを指定していません。これは、when(...)の呼び出しに含まれている必要があります

私はこのようなコードを期待しています...

UserDao mockDao = mock(UserDao.class);

when(mockDao.get(list)).thenReturn(users);
4
Brad

まず第一に、あなたはUserDaoをテストしていません。

次に、anyList()はmockitoマッチャーを生成し、何かを行うにはマッチャーをuserDao.getByCriteriaに渡す必要があるため、Matchers.same(リスト)またはMatchers.eq(リスト)を使用する必要があります。

デフォルトではMockitoがNiceモックを作成し、予期しないメソッド呼び出しでデフォルトでnullを返すため、例外が表示されます。

0
Rrr

AnyList()はあなたがモックしているメソッドであり、listはメソッドではないと思います。このテストケースを書いているものは何でも、ソースコードを投稿してください。

0
Rocky