【发布时间】:2014-11-14 16:03:16
【问题描述】:
我正在尝试编写一个测试来强调下一个类的行为。它是网站的比较器,但由于某种原因,“propertiesCreatedBy”部分不起作用。这是一个非常奇怪的问题,只要其余字段正常工作并且可以正确排序,但是当尝试按此列排序时,顺序似乎是随机的:
import java.io.Serializable;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
public class CaseNoteDTOComparator implements Comparator, Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
protected class CaseNoteDTOComparatorInternal implements Serializable {
private String[] properties = null;
boolean[] shouldReverse = null;
public CaseNoteDTOComparatorInternal(String[] properties, boolean[] shouldReverse) {
this.properties = properties;
this.shouldReverse = shouldReverse;
}
public int compare(Object obj1, Object obj2) {
int result = 0;
for (int i = 0; i < properties.length; i++) {
JavaBeanNamedPropertyComparator comparator =
new JavaBeanNamedPropertyComparator(properties[i], shouldReverse[i]);
result = comparator.compare(obj1, obj2);
if(result != ComparatorConstants.EQUAL) {
return result;
}
}
//actually object are equals....
return ComparatorConstants.LESS_THAN;
}
public void setDescending(boolean descending) {
for (int i = 0; i < shouldReverse.length; i++) {
shouldReverse[i] = descending;
}
}
}
private static Map comparators = new HashMap();
//statically initialise comparators
{
final String[] propertiesEffectiveDate = { EFFECTIVE_DATE_NAME, CREATED_ON };
boolean[] shouldReverseEffectiveDate= {false, false};
comparators.put(EFFECTIVE_DATE_NAME, new CaseNoteDTOComparatorInternal(propertiesEffectiveDate, shouldReverseEffectiveDate));
final String[] propertiesId = { ID_NAME };
boolean[] shouldReverseId = {false};
comparators.put(ID_NAME, new CaseNoteDTOComparatorInternal( propertiesId, shouldReverseId));
final String[] propertiesType = { TYPE_NAME, ID_NAME };
boolean[] shouldReverseType = {false, false};
comparators.put(TYPE_NAME, new CaseNoteDTOComparatorInternal( propertiesType, shouldReverseType));
final String[] propertiesTitle = { TITLE_NAME, ID_NAME };
boolean[] shouldReverseTitle = {false, false};
comparators.put(TITLE_NAME, new CaseNoteDTOComparatorInternal( propertiesTitle, shouldReverseTitle));
final String[] propertiesRecordedVS = { PERSON_LASTNAME_NAME, PERSON_FIRSTNAME_NAME, ID_NAME };
boolean[] shouldReverseRecordedVS= {false, false, false};
comparators.put(RECORDED_VS, new CaseNoteDTOComparatorInternal( propertiesRecordedVS, shouldReverseRecordedVS));
final String[] propertiesCreatedBy = { CREATED_BY_LASTNAME_NAME, CREATED_BY_FIRSTNAME_NAME, ID_NAME };
boolean[] shouldReverseCreatedBy= {false, false, false};
comparators.put(CREATED_BY_NAME, new CaseNoteDTOComparatorInternal( propertiesCreatedBy, shouldReverseCreatedBy));
final String[] propertiesOrganisation = { ORGANISATION_NAME, ID_NAME };
boolean[] shouldReverseOrganisation= {false, false};
comparators.put(ORGANISATION_NAME, new CaseNoteDTOComparatorInternal( propertiesOrganisation, shouldReverseOrganisation));
final String[] propertiesScore = { LUCENE_INDEX_SCORE};
boolean[] shouldReverseScore = {false};
comparators.put(LUCENE_INDEX_SCORE, new CaseNoteDTOComparatorInternal( propertiesScore, shouldReverseScore));
}
private CaseNoteDTOComparatorInternal comparator = null;
public static final String ID_NAME = "id";
public static final String EFFECTIVE_DATE_NAME = "effectiveDate";
public static final String TYPE_NAME = "displayCaseNoteType";
public static final String TITLE_NAME = "title";
public static final String PERSON_LASTNAME_NAME = "personLastName";
public static final String PERSON_FIRSTNAME_NAME = "personFirstName";
public static final String RECORDED_VS = "recordedVS";
public static final String CREATED_BY_NAME = "createdBy";
public static final String CREATED_BY_FIRSTNAME_NAME = "createdByFirstName";
public static final String CREATED_BY_LASTNAME_NAME = "createdByLastName";
public static final String CREATED_ON = "createdOn";
public static final String ORGANISATION_NAME = "organisationName";
public static final String DEFAULT_FIELD_NAME = EFFECTIVE_DATE_NAME;
public static final String LUCENE_INDEX_SCORE = "score";
public CaseNoteDTOComparator(String fieldKeyName, boolean descending) {
this.comparator = (CaseNoteDTOComparatorInternal)comparators.get(fieldKeyName);
if(comparator==null) {
this.comparator = (CaseNoteDTOComparatorInternal)comparators.get(DEFAULT_FIELD_NAME);
}
comparator.setDescending(descending);
}
public int compare(Object obj1, Object obj2) {
return comparator.compare(obj1, obj2);
}
}
我花了几个小时查看代码并进行实验,但找不到问题所在。除了为班级实施测试之外,我还想修复它,但找不到问题。我将非常感谢任何提示。
谢谢!
【问题讨论】:
-
那是一大堆代码 - 我们需要所有这些来查看您的问题吗?我怀疑不是。你能把它减少到向我们展示问题所需的最少代码吗?
标签: java unit-testing sorting tdd comparator