#java #spring #junit #integration-testing
#java #весна #junit #интеграция-тестирование
Вопрос:
Я столкнулся с проблемой при выполнении integration testcase. Согласно приведенному ниже запросу, выполняется сравнение дат. Когда этот запрос выполняется testcase, он возвращает нулевой результат. В тот момент, когда я удаляю условие where из запроса, он возвращает правильный результат как 2. Чтобы продолжить, в моем тестовом примере я сначала выбрал сотрудников и проверил, что у них правильная дата и удовлетворяют условию where. Но я все еще в замешательстве, когда эта проверка не выполняется на уровне DAO через Integration testcase.
Ниже приведен класс EmployeeDAOImpl
private static final String EMP_COUNT_BY_COMPANY_QUERY = "select count(employeeid) from ref_employee e join txn_user u on (e.createdby=u.userid and u.companyid = :companyId) where e.createddate between :startDate and :endDate";
@Override
public Long getEmpCountByCompany(Long companyId) {
BigInteger recordCount = (BigInteger) getHibernateTemplate().execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException, SQLException {
SQLQuery sqlQuery = session.createSQLQuery(EMP_COUNT_BY_COMPANY_QUERY);
sqlQuery.setParameter("companyId", companyId);
sqlQuery.setParameter("startDate", getStartOfCurrentDate());
sqlQuery.setParameter("endDate", getEndOfCurrentDate());
return sqlQuery.uniqueResult();
}
});
return recordCount.longValue();
}
private Date getEndOfCurrentDate() {
Date end = DateUtils.addDays(new Date(), 1);
return DateUtils.truncate(end , Calendar.DATE);
}
private Date getStartOfCurrentDate() {
return DateUtils.truncate(new Date(), Calendar.DATE);
}
Ниже приведен класс employeeServiceClass
@Override
public Long getEmpCountByCompany(Long companyId) {
return empDao.getEmpCountByCompany(companyId);
}
Ниже приведен тест Junit
@Transactional
@DatabaseSetup(value = "EmployeeControllerIT.xml", type = DatabaseOperation.CLEAN_INSERT)
public class EmployeeControllerIT extends SpringMvcIT {
@Autowired
EmployeeService employeeService;
@Before
public void setUpEmployeeControllerIT() {
Set<Long> empIds = new HashSet<Long>();
empIds.add(new Long("416908791"));
empIds.add(new Long("416908790"));
List<Employee> empList = empService.getEmpById(empIds);
for (Employee emp : empList) {
emp.setCreatedDate(new Date());
emp.getAuditInfo().setCreatedBy(user);
employeeService.saveOrUpdateEmployee(emp);
}
}
@Test
public void shouldReturnFalseIncaseEmpCountIsReached2() throws Exception {
mockMvc.perform(
get(EMPLOYEE_VALIDATION).param("action", "isEmployeeAllowed")
.accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()).andExpect(jsonPath("$.isValidCount", is(false)));
}
}
Ниже приведен контроллер
@Controller
@RequestMapping("/employeeValidation.htm")
public class EmployeeValidationController {
private static final String VALIDATE_EMPLOYEE_ELIGIBILITY = "action=isEmployeeAllowed";
@RequestMapping(method = RequestMethod.GET, params = { VALIDATE_EMPLOYEE_ELIGIBILITY })
public void validateEmployeeEligibility(HttpServletResponse response) throws Exception {
Long count = employeeService.getEmpCountByCompany(Constant.COMPANY_ID)
JSONObject employeeValidationObject = new JSONObject();
boolean flag = true;
if(count>=2) {
flag = false;
}
employeeValidationObject.put("isValidCount", flag);
response.setContentType("application/json");
response.getOutputStream().write(employeeValidationObject.toString().getBytes("UTF-8"));
}
}
Комментарии:
1. Вы пытались использовать отладчик, чтобы выяснить, соответствуют ли даты тем, что вы ожидали?
2. Я не использовал отладчик (не могли бы вы указать мне ссылку, чтобы узнать, как отлаживать testcase), но я ввел инструкции sysout, которые отображают ожидаемые даты
3. Вы работаете с eclipse?
4. @Jens Да, я работаю в eclipse, а инструментом сборки является gradle
5. Смотрите это: vogella.com/tutorials/EclipseDebugging/article.html