美文网首页TDD(测试驱动开发)Dev练功房代码优雅
TDD和重构练习-FizzBuzz Sprint 3 - 集成测

TDD和重构练习-FizzBuzz Sprint 3 - 集成测

作者: CodingDetails | 来源:发表于2019-05-16 10:29 被阅读5次

    FizzBuzz

    Sprint 3

    步骤分解

    实现主程序

    • 创建Main类和main方法
    • main方法中调用Game
    • 有个变量--操作计数100,使用最保险的方法构造函数传入,保证Game类的封装性
    • 调用play方法
    public class Main {
        public static void main(String[] args) {
            Game game = new Game(100);
            game.play();
        }
    }
    
    • Alt+Enter快速创建Game类和play方法
    • play方法中实例化FizzBuzz,并调用其toString方法
    public class Game {
        private int count;
    
        public Game(int i) {
            this.count = i;
        }
    
        public void play() {
            for (int i = 0; i < this.count; i++) {
                FizzBuzz item = new FizzBuzz(i);
                System.out.println(item.toString());
            }
        }
    }
    
    • Ctrl+Shift+F10运行,得到符合预期的结果。

    重构

    • Game类里面内置了规则,违反了单一职责原则
      • 规则适合在Game类创建时指定,构造时传入规则
      • play可能被多次调用,计数适合在play时传入
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
            List<Executable> rules = Rules.all();
            Game game = new Game(rules);
            game.play(100);
        }
    }
    
    import java.util.List;
    
    public class Game {
    
        private final List<Executable> rules;
    
        public Game(List<Executable> rules) {
            this.rules = rules;
        }
    
        public void play(int count) {
            for (int i = 0; i < count; i++) {
                FizzBuzz item = new FizzBuzz(i);
                System.out.println(item.apply(this.rules));
            }
        }
    }
    
    • FizzBuzztoString要得出结果,同时还依赖于规则,所以重命名为apply,传入规则rules
    public String apply(List<Executable> rules) {
        return rules.stream()
                .map(rule -> rule.exec(this.value))
                .filter(value -> !value.isEmpty())
                .distinct()
                .reduce(String::concat)
                .orElse(String.valueOf(this.value));
    }
    
    • 更新测试代码,调用apply方法
    public class FizzBuzzTest {
        @ParameterizedTest(name = "should return {0} given {1}")
        @CsvSource({
                "1, 1",
                "3, Fizz",
                "5, Buzz",
                "15, FizzBuzz",
                "31, Fizz",
                "56, Buzz",
                "53, FizzBuzz",
        })
        void should_play_fizz_buzz(int input, String expected) {
            FizzBuzz item = new FizzBuzz(input);
            assertEquals(expected, item.apply(Rules.all()));
        }
    }
    

    后续变化

    目前只实现了一个规则集合的创建方法Rules.all,后续需求变化时,可提供新的工厂方法来创建规则集合,由main方法传给Game类。

    Over

    相关文章

      网友评论

        本文标题:TDD和重构练习-FizzBuzz Sprint 3 - 集成测

        本文链接:https://www.haomeiwen.com/subject/coybaqtx.html