实践中的重构25_UT也需要持续重构
UT是个好东西,在对代码进行持续重构的过程中,UT可以保证代码的正确性。同时,和产品代码一样,UT也是需要不断重构的。
有一个接口,原始定义和对应的UT如下:
/** * 构建一个按照自然周排好的日期列表(包括最近30天,不包含当日),周时间距离现在越近,在列表中越靠前。 * * <pre> * 保证每个子列表的大小都为7(一个星期的天数),没有日期则以null填充。 * * 例子: * 如果当前时间是2010-09-08(星期3)则构建的列表为: * 第1个subList 2010-09-06(星期1),2010-09-07(星期2),null,null,null,null,null, * 第2个subList 2010-08-30(星期1),2010-08-31(星期2),2010-09-01(星期3),2010-09-02(星期4),2010-09-03(星期5),2010-09-04(星期6),2010-09-05(星期日) * ... * 第n个subList null,null,null,null,date(星期5),date(星期6),date(星期日) * </pre> * * * @return 返回构建好的列表。 * */public List<List<Date>> getDaysInWeekList();
private DateService dateService;@Beforepublic void setUp() {dateService = new DateServiceImpl();}@Testpublic void test() {List<List<Date>> list = dateService.getDaysInWeekList();Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DATE, -30);int count = 0;for (int i = list.size() - 1; i >= 0; i--) {List<Date> subList = list.get(i);Assert.assertEquals(7, subList.size());for (Date date : subList) {if (date == null) {continue;} else {Date tem = calendar.getTime();Assert.assertEquals(DayUtil.getDayBeginString(tem),DayUtil.getDayBeginString(date));calendar.add(Calendar.DATE, 1);count++;}}}Assert.assertEquals(30, count);}private NewDateServiceImpl_0 newDateService;@Beforepublic void initNewDateService() {newDateService = new NewDateServiceImpl_0();newDateService.setUserService(new UserService() {@Overridepublic UserInfo findUserInfo(String userId) {UserInfo userInfo = new UserInfo();userInfo.setModifyDate(new Date());return userInfo;}});}@Testpublic void testGetDaysInWeekList() {List<List<Date>> list = newDateService.getDaysInWeekList("allen");Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DATE, -30);int count = 0;for (int i = list.size() - 1; i >= 0; i--) {List<Date> subList = list.get(i);Assert.assertEquals(7, subList.size());for (Date date : subList) {if (date == null) {continue;} else {Date tem = calendar.getTime();Assert.assertEquals(DayUtil.getDayBeginString(tem),DayUtil.getDayBeginString(date));calendar.add(Calendar.DATE, 1);count++;}}}Assert.assertEquals(30, count);}protected NewDateService newDateService;private void setUpUserService(final UserInfo userInfo) {newDateService.setUserService(new UserService() {@Overridepublic UserInfo findUserInfo(String userId) {return userInfo;}});}@Beforepublic abstract void initNewDateService();@Testpublic void testGetDaysInWeekListWithUserInfo_1() {final UserInfo userInfo = new UserInfo();userInfo.setModifyDate(DayUtil.addDays(new Date(), -2));newDateService.setUserService(new UserService() {@Overridepublic UserInfo findUserInfo(String userId) {return userInfo;}});List<List<Date>> list = newDateService.getDaysInWeekList("allen");assertResult(list, 29);}@Testpublic void testGetDaysInWeekListWithUserInfo_2() {final UserInfo userInfo = new UserInfo();userInfo.setModifyDate(DayUtil.addDays(new Date(), -28));newDateService.setUserService(new UserService() {@Overridepublic UserInfo findUserInfo(String userId) {return userInfo;}});List<List<Date>> list = newDateService.getDaysInWeekList("allen");assertResult(list, 3);}@Testpublic void testGetDaysInWeekListWithNull() {setUpUserService(null);List<List<Date>> list = newDateService.getDaysInWeekList("allen");assertResult(list, 30);}private void assertResult(List<List<Date>> list, int expectedCount) {Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DATE, -30);int count = 0;for (int i = list.size() - 1; i >= 0; i--) {List<Date> subList = list.get(i);Assert.assertEquals(7, subList.size());for (int k = 0; k < subList.size(); k++) {Date date = subList.get(k);if (date == null) {continue;} else {Date tem = calendar.getTime();Assert.assertEquals(DayUtil.getDayBeginString(tem),DayUtil.getDayBeginString(date));int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);if (k != 6) {Assert.assertEquals(k + 2, dayOfWeek);} else {Assert.assertEquals(Calendar.SUNDAY, dayOfWeek);}calendar.add(Calendar.DATE, 1);count++;}}}Assert.assertEquals(expectedCount, count);}private final static int DAYS_OF_WEEK = 7;protected NewDateService newDateService;private void setUpUserService(final UserInfo userInfo) {newDateService.setUserService(new UserService() {@Overridepublic UserInfo findUserInfo(String userId) {return userInfo;}});}@Beforepublic abstract void initNewDateService();private void testGetDaysInWeekListWithUserInfo(int addDays,int expectedCount) {UserInfo userInfo = new UserInfo();userInfo.setModifyDate(DayUtil.addDays(new Date(), addDays));setUpUserService(userInfo);List<List<Date>> list = newDateService.getDaysInWeekList("allen");assertResult(list, expectedCount);}@Testpublic void testGetDaysInWeekListWithUserInfoAll() {testGetDaysInWeekListWithUserInfo(-31, 0);for (int i = -30; i <= -1; i++) {testGetDaysInWeekListWithUserInfo(i, 31 + i);}}@Testpublic void testGetDaysInWeekListWithNull() {setUpUserService(null);List<List<Date>> list = newDateService.getDaysInWeekList("allen");assertResult(list, 30);}private void assertResult(List<List<Date>> resultList, int expectedCount) {Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DATE, -30);int count = 0;for (int i = resultList.size() - 1; i >= 0; i--) {List<Date> weekList = resultList.get(i);Assert.assertEquals(DAYS_OF_WEEK, weekList.size());for (int k = 0; k < weekList.size(); k++) {Date date = weekList.get(k);if (date != null) {Date tem = calendar.getTime();Assert.assertEquals(DayUtil.getDayBeginString(tem),DayUtil.getDayBeginString(date));int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);Assert.assertEquals(convertIndexToDayOfWeek(k), dayOfWeek);calendar.add(Calendar.DATE, 1);count++;}}}Assert.assertEquals(expectedCount, count);}private int convertIndexToDayOfWeek(int index) {return (index + 1) % DAYS_OF_WEEK + 1;}