誰かが私に以下のシナリオを説明できますか
テストするコード
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()
が指定された場合、実際にはどうなりますか?
あなたはすでにあなたの問題を解決していると確信していますが、誰かが同じ問題に遭遇した場合に備えて、ここに答えがあります:
提供したコードでは、作成したモックの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());
}
コードが完成している場合(そうではないかもしれません)、get()
メソッドを含むモックオブジェクトを指定していません。これは、when(...)
の呼び出しに含まれている必要があります
私はこのようなコードを期待しています...
UserDao mockDao = mock(UserDao.class);
when(mockDao.get(list)).thenReturn(users);
まず第一に、あなたはUserDaoをテストしていません。
次に、anyList()はmockitoマッチャーを生成し、何かを行うにはマッチャーをuserDao.getByCriteriaに渡す必要があるため、Matchers.same(リスト)またはMatchers.eq(リスト)を使用する必要があります。
デフォルトではMockitoがNiceモックを作成し、予期しないメソッド呼び出しでデフォルトでnullを返すため、例外が表示されます。
AnyList()はあなたがモックしているメソッドであり、listはメソッドではないと思います。このテストケースを書いているものは何でも、ソースコードを投稿してください。