在工作中,我尽可能多地练习测试驱动开发。我经常遇到的一件事是必须设置一堆 DTO,当它们的结构稍微复杂时,这会变成很多代码。这样做的问题是代码经常重复,我觉得它分散了测试的主要目的。例如,使用一个稍微人为和浓缩的示例(在 java 中,jUnit + mockito):
class BookingServiceTest {
private final static int HOUR_IN_MILLIS = 60 * 60 * 1000;
private final static int LOCATION_ID = 1;
@Mock
private BookingLocationDao bookingLocationDao;
@InjectMocks
private BookingService service = new BookingService();
@Test
public void yieldsAWarningWhenABookingOverlapsAnotherInTheSameLocation() {
// This part is a bit repetetive over many tests:
Date now = new Date()
Location location = new Location()
location.setId(LOCATION_ID);
Booking existingBooking = new Booking()
existingBooking.setStart(now);
existingBooking.setDuration(HOUR_IN_MILLIS);
existingBooking.setLocation(location);
// To here
when(bookingLocationDao.findBookingsAtLocation(LOCATION_ID))
.thenReturn(Arrays.asList(existingBooking));
// Then again setting up a booking :\
Booking newBooking = new Booking();
newBooking.setStart(now);
newBooking.setDuration(HOUR_IN_MILLIS / 2);
newBooking.setLocation(location);
// Actual test...
BookingResult result = service.book(newBooking);
assertThat(result.getWarnings(), hasSize(1));
assertThat(result.getWarnings().get(0).getType(), is(BookingWarningType.OVERLAPING_BOOKING));
}
}
在这个例子中,设置并没有那么复杂,所以我不会想太多。但是,当需要更复杂的输入时,设置方法输入的代码往往会增加。在多个测试中使用类似的输入会加剧这个问题。将设置代码重构为单独的 TestUtil 类会有所帮助。那么问题是在几个月后编写新测试时很难找到这些实用程序类,这会导致重复。
- 为了最大限度地减少测试设置中的代码重复,处理这种“复杂”DTO 的好方法是什么?
- 在使用类似代码时,如何确保找到提取的 TestUtilities?
- 我做错了吗?:) 我应该以另一种方式构建我的软件来完全避免这种情况吗?如果是这样,怎么做?