В моем проекте, в классе DAO, в методе удаления, в качестве ответа на удаление я вернул HashMap. Я использовал JPA и Spring Boot. В Try-Catch, после успешного удаления, в карту в качестве ключа будет вставлен ключ «status», а в качестве строки значения «OK».
Как известно, в JPA, если сущность не найдена по первичному ключу, во время исключения исключения произойдет. После исключения в HasMap в качестве ключа «status» будет вставлено значение «FAIL».
Этот HashMap будет возвращен методом удаления DAO, и я намерен использовать его в JUnit для утверждения. Теперь проблема в том, что он работает для успешного удаления, но если я пытаюсь удалить объект, который не существует, назначение значения ключа работает в методе Dao, но когда я пытаюсь получить к нему доступ в тесте JUnit метод, он показывает ноль. Даже если я напечатал HasMap в методе удаления, он показывает его значение ключа, но в Junit, в то же время, показывает ноль.
Код модульного теста
@Test
public void test3_delete() {
id = getID();
Map<String, String> response = new HashMap<>();
try {
response = dao_Profile_Basic_I.delete(id);
} catch (Exception e) {
System.out.println("Test Delete Fail!");
}
System.out.println("response (test) : " + response.toString());
assertEquals("OK",response.get("status"));
}
Корпус 1
@Override
public Map<String, String> delete(String id) {
System.out.println("DAO Delete: ");
Map<String, String> response = new HashMap<>();
String s = "";
try {
ProfileBasic profileBasic = entityManager.find(ProfileBasic.class, new Long(id));
entityManager.remove(profileBasic);
s = "OK";
} catch (Exception e) {
s = "FAIL";
System.out.println("Profile Basic Delete Fail!");
// e.printStackTrace();
}
response.put("status", s);
System.out.println("response (dao) : "+ response.toString());
return response;
}
Выход
Profile Basic Delete Fail!
response (dao) : {status=FAIL}
Test Delete Fail!
response (test) : {}
Корпус 2
@Override
public Map<String, String> delete(String id) {
System.out.println("DAO Delete: ");
Map<String, String> response = new HashMap<>();
try {
ProfileBasic profileBasic = entityManager.find(ProfileBasic.class, new Long(id));
entityManager.remove(profileBasic);
response.put("status","OK");
} catch (Exception e) {
System.out.println("Profile Basic Delete Fail!");
response.put("status","FAIL");
// e.printStackTrace();
}
System.out.println("response (dao) : "+ response.toString());
return response;
}
Выход
Profile Basic Delete Fail!
response (dao) : {status=FAIL}
Test Delete Fail!
response (test) : {}
Корпус 3
@Override
public Map<String, String> delete(String id) {
System.out.println("DAO Delete: ");
Map<String, String> response = new HashMap<>();
ProfileBasic profileBasic=null;
try {
profileBasic = entityManager.find(ProfileBasic.class, new Long(id));
response.put("status", "OK");
} catch (Exception e) {
System.out.println("Profile Basic Delete Fail!");
response.put("status", "FAIL");
// e.printStackTrace();
}
entityManager.remove(profileBasic);
System.out.println("response (dao) : " + response.toString());
return response;
}
Выход:
Profile Basic Delete Fail!
response (dao) : {status=FAIL}
Test Delete Fail!
response (test) : {}
Для успешного удаления, сообщение выглядит следующим образом:
response (dao) : {status=OK}
//hibernate sql show
response (test) : {status=OK}
До сих пор, я мог понять, для исключения, означает, что при попытке удалить нулевую сущность назначение пары ключ-значение HasMap находится в Дао удалить метод, но возвращается к тестовому методу.
В чем может быть причина?
Полный код кода можно получить в GitHub: Часть в GitHub Это проект с открытым исходным кодом, вы можете внести свой вклад ,