例子
我们现在要测试我们用于创建 Video Object 的URL与调用 VideoPlaybackService 中的 playCurrentVideo 方法的返回值适配。我们编写了一个helper方法,可以传入用于实例化 Video Object 的一些参数。但是大多数情况下我们不需要设置所有的参数,比如 duration 和 displayDate 对于这个方法的测试就不起到任何作用。也就是说,我们在测试中添加了额外的且无用的信息,使测试代码可读性降低。
- @Test
- public void shouldReceiveCurrentUrlWhenVideoAvailable() {
- String url = "http://www.my_video.mp4";
- String displayDate = "Jan. 08, 2016";
- double duration = 0.30;
- playbackService.setCurrentVideo(createVideo(url, displayDate, duration));
- String actualUrl = playbackService.playCurrentVideo();
- assertEquals("the urls are not the same", url, actualUrl);
- }
- private Video createVideo(String url, String displayDate, double duration) {
- Video video = new Video();
- video.setUrl(url);
- video.setDisplayDate(displayDate);
- video.setDuration(duration);
- return video;
- }
解决方案
我们可以通过使用建造者(Builder)模式优化 Video 类,从而使额外的属性不再是必需的。下面是视频的URL的setter方法的未经优化的代码。
- public void setUrl(String url) {
- this.url = url;
- }
我们可以升级这个方法,使它回传Video对象(this)而不是返回空。让我们看一看这可以怎样增强测试代码的可读性和理解性。
使用建造者模式
- public Video setUrl(String url) {
- this.url = url;
- return this;
- }
- @Test
- public void shouldReceiveCurrentUrlWhenVideoAvailable() {
- String url = "http://www.my_video.mp4";
- playbackService.setCurrentVideo(new Video().setUrl(url));
- String actualUrl = playbackService.playCurrentVideo();
- assertEquals("the urls are not the same", url, actualUrl);
- }
这样代码就具有更强的可读性和可维护性了。