我如何为Java的验证班写Junit



我听说Mockito框架确实适合测试目的。

任何人都可以帮助我为以下代码写一个好的junit。

@Component
public class DataIntegrityValidatorForUpdate extends EmployeeCommonValidator implements Validator {
    @Autowired
    private EmployeeRepository employeeRepository;
    @Override
    public boolean supports(Class<?> paramClass) {
        return Employee.class.equals(paramClass);
    }
    @Override
    public void validate(Object targetObject, Errors errors) {
        if (!(targetObject instanceof Employee))
            return;
        Employee employee = (Employee) targetObject;
        Long employeeId = employee.getId();
        String tenantId = employee.getTenantId();
        // FIXME employee.getId == null or empty then throw error employee id is
        // required
        if (isEmpty(employeeId)) {
            errors.rejectValue("employee.id", "no value", "provide employee id for update");
            return;
        }
        if (!employeeRepository.checkIfEmployeeExists(employeeId, tenantId)) {
            // FIXME throw error employee id does not exist
            errors.rejectValue("employee.id", "no value present", "employee id doesn't exist");
            return;
        }
        validateEmployee(employee, errors);
        validateAssignments(employee.getAssignments(), employeeId, tenantId, errors);
    public void validateEmployee(Employee employee, Errors errors) {
        // FIXME call common validator.validateEmployee
        super.validateEmployee(employee, errors);
        // FIXME : check only for different employees
        if (checkIfColumnValueIsSameInDB("egeis_employee", "code", employee.getCode(), employee.getId(), employee.getTenantId())) {
            errors.rejectValue("employee.code", "invalid", "Employee Code cannot be changed.");
        }
        if ((employee.getPassportNo() != null) && duplicateExists("egeis_employee", "passportNo",   employee.getPassportNo(), employee.getId(), employee.getTenantId())) {
            errors.rejectValue("employee.passportNo", "concurrent", "passportNo already exists");
        }
        if ((employee.getGpfNo() != null) && duplicateExists("egeis_employee", "gpfNo", employee.getGpfNo(), employee.getId(), employee.getTenantId())) {
            errors.rejectValue("employee.gpfNo", "concurrent", "gpfNo already exists");
        }
    }

    private void validateAssignments(List<Assignment> assignments, Long employeeId, String tenantId, Errors errors) {
        validateIdsForAssignment(assignments, employeeId, tenantId, errors);
        for (int index = 0; index < assignments.size(); index++) {
            // validateDocumentsForNewAssignment(assignments.get(index),
            // errors, index);
        }
    }
    private void validateIdsForAssignment(List<Assignment> assignments, Long employeeId, String tenantId, Errors errors) {
        Map<Long, Integer> idsMap = new HashMap<>();
        for (int index = 0; index < assignments.size(); index++) {
            if (assignments.get(index).getId() != null) // FIXME check if long
                                                    // gets default value of
                                                    // 0L
                idsMap.put(assignments.get(index).getId(), index);
        }
        if (!idsMap.isEmpty())
            validateEntityId(idsMap, EntityType.ASSIGNMENT, employeeId, tenantId, errors);
    }

    public Boolean duplicateExists(String table, String column, String value, Long id, String tenantId) {
        Long idFromDb = employeeRepository.getId(table, column, value, tenantId);
        if (idFromDb == 0 || id.equals(idFromDb))
            return false;
        return true;
    }
    public Boolean checkIfColumnValueIsSameInDB(String table, String column, String value, Long id, String tenantId) {
        Long idFromDb = employeeRepository.getId(table, column, value, tenantId);
        if (id.equals(idFromDb))
            return false;
        return true;
    }
}

鉴于您的生产代码,写作测试非常简单;喜欢:

public class DataIntegrityValidatorForUpdateTest {
@Mock
Errors mockedErrors;
@Mock
EmployeeRepository mockedRepository;
@InjectMocks
DataIntegrityValidatorForUpdate underTest;
@Before
public void setup() {
  initMocks();
}
@Test
public void testNotAnEmployee() {
  underTest.validate("not an employee", mockedErrors);
  verifyZeroInteractions(mockedRepository, mockedErrors);
}

这做什么:

  • 它模拟了您需要控制的两个两个对象才能测试此类
  • 它使用@InjectMocks注释来实例化您打算测试的类的实例
  • 然后测试方法的一个一个方面 - 该方法用参数调用,该参数应导致方法返回并无需做任何事情

上面的意思是灵感。现在,必须增强它,以涵盖您方法所需的所有可能路径。您的大多数测试方法看起来都相似。但是,您将必须学习如何使用Mockito进行验证您对模拟对象的某些调用。

,但请不是期望我们为您做到这一点。这是您的项目,您必须研究文档和教程,以了解需要做什么。

除此之外:从干净的代码角度来看,我建议您对整个事情进行重构。我宁愿抛出异常以指示失败的验证;而不是使用In/Out参数,例如errors

最新更新