Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How to write testable code

How to write testable code

perforb

June 04, 2018
Tweet

More Decks by perforb

Other Decks in Programming

Transcript

  1. 0 40 2 4 4 4 / 0
    1 2 02

    View Slide


  2. $,2*/%-,.+3/#'"#$
    &
    $ (13,!&

    View Slide

  3. 2
    2
    1 32

    View Slide

  4. U 2
    U 1
    .
    3 J

    View Slide

  5. .

    View Slide

  6. .
    public class Fight {
    private State state = new State();
    private Player player1, player2;
    public Fight(Player player1, Player player2) {
    this.player1 = player1;
    this.player2 = player2;
    }
    ...
    public void attack(Player attacker, Weapon weapon) {
    Player opponent = getOpponentOf(attacker);
    int damage = calculateDamage(opponent, weapon);
    opponent.setHp(opponent.getHp() - damage);
    Utility.updatePlayer(opponent);
    updateState();
    }
    public State getState() {
    return state;
    }
    ...
    }

    View Slide

  7. .
    public class FightTest {
    @Test
    public void testAttack() {
    Player player1 = new Player();
    Player player2 = new Player();
    Weapon weapon = new Weapon();
    Fight fight = new Fight(player1, player2);
    fight.attack(player1, weapon);
    fight.attack(player1, weapon);
    fight.attack(player1, weapon);
    State state = fight.getState();
    assertThat(state.isFinished(), is(true));
    }
    }

    View Slide



  8. View Slide

  9. public class Fight {
    private State state = new State();
    private Player player1, player2;
    public Fight(Player player1, Player player2) {
    this.player1 = player1;
    this.player2 = player2;
    }
    ...
    public void attack(Player attacker, Weapon weapon) {
    Player opponent = getOpponentOf(attacker);
    int damage = calculateDamage(opponent, weapon);
    opponent.setHp(opponent.getHp() - damage);
    Utility.updatePlayer(opponent);
    updateState();
    }
    public State getState() {
    return state;
    }
    ...
    }
    .

    View Slide

  10. B
    . D
    public class Fight {
    private State state = new State();
    private Player player1, player2;
    public Fight(Player player1, Player player2) {
    this.player1 = player1;
    this.player2 = player2;
    }
    ...
    public void attack(Player attacker, Weapon weapon) {
    Player opponent = getOpponentOf(attacker);
    int damage = calculateDamage(opponent, weapon);
    opponent.setHp(opponent.getHp() - damage);
    Utility.updatePlayer(opponent);
    updateState();
    }
    public State getState() {
    return state;
    }
    ...
    }
    .

    View Slide

  11. public class Fight {
    private State state = new State();
    private Player player1, player2;
    public Fight(Player player1, Player player2) {
    this.player1 = player1;
    this.player2 = player2;
    }
    ...
    public void attack(Player attacker, Weapon weapon) {
    Player opponent = getOpponentOf(attacker);
    int damage = calculateDamage(opponent, weapon);
    opponent.setHp(opponent.getHp() - damage);
    Utility.updatePlayer(opponent);
    updateState();
    }
    public State getState() {
    return state;
    }
    ...
    }
    .

    View Slide

  12. 2 .

    View Slide


  13. View Slide

  14. )

    ))
    ) ( )


    View Slide

  15. ()



    <>


    View Slide

  16. F
    .
    interface PlayerUpdater {
    public void updatePlayer(Player player);
    }
    F

    View Slide

  17. public class PlayerUpdaterImpl implements PlayerUpdater {
    @Override
    public void updatePlayer(Player player) {
    Utility.updatePlayer(player);
    }
    }
    .

    View Slide

  18. B
    .
    public class Fight {
    private State state = new State();
    private Player player1, player2;
    private final PlayerUpdater updater;
    public Fight(Player player1, Player player2) {
    this(player1, player2, new PlayerUpdaterImpl());
    }
    protected Fight(Player player1, Player player2,
    PlayerUpdater updater) {
    this.player1 = player1;
    this.player2 = player2;
    this.updater = updater;
    }
    ...
    public void attack(Player attacker, Weapon weapon) {
    Player opponent = getOpponentOf(attacker);
    int damage = calculateDamage(opponent, weapon);
    opponent.setHealth(opponent.getHealth() - damage);
    updater.updatePlayer(opponent);
    updateState();
    }
    }
    . P
    U . .
    .. .
    F

    View Slide

  19. P
    . ( (
    public class Fight {
    private State state = new State();
    private Player player1, player2;
    private final PlayerUpdater updater;
    public Fight(Player player1, Player player2) {
    this(player1, player2, new PlayerUpdaterImpl());
    }
    protected Fight(Player player1, Player player2,
    PlayerUpdater updater) {
    this.player1 = player1;
    this.player2 = player2;
    this.updater = updater;
    }
    ...
    public void attack(Player attacker, Weapon weapon) {
    Player opponent = getOpponentOf(attacker);
    int damage = calculateDamage(opponent, weapon);
    opponent.setHealth(opponent.getHealth() - damage);
    updater.updatePlayer(opponent);
    updateState();
    }
    }
    ) ) .
    I U B D
    ( I ( (
    I F

    View Slide

  20. import static org.mockito.Mockito.*;
    public class FightTest {
    @Test
    public void testAttack() {
    Player player1 = new Player();
    Player player2 = new Player();
    Weapon weapon = new Weapon();
    // PlayerUpdater
    PlayerUpdater updater = mock(PlayerUpdater.class);
    // Fight
    Fight fight = new Fight(player1, player2, updater);
    fight.registerHit(player1, weapon);
    fight.registerHit(player1, weapon);
    fight.registerHit(player1, weapon);
    State state = fight.getState();
    assertThat(state.isFinished(), is(true));
    // updatePlayer() 3

    verify(updater, times(3)).updatePlayer(player2);
    }
    }
    M
    .
    F P U F

    View Slide

  21. I
    • I

    • I B
    • D J B D J

    • B D J


    • A

    View Slide

  22. I

    • (
    • g
    • JgW P
    • O D
    • g

    • (
    • e
    • ( Vc )
    • / l g A
    • aj Aa g
    • j
    • u B t

    View Slide

  23. yw
    • yw fo a
    • 2101
    • yw fmea
    • p wcD m p D w
    • c
    • I m p w
    • .
    • 385 2/

    • t mD n p wc p w c cp
    • W myw c dmea
    • JP n wn Or p
    • :AA B8A 78 4 8 A # # # 9

    View Slide


  24. • )( (
    • PJ
    • B H P
    • HAD
    • PB

    • - )
    • O
    • H
    • S H I

    View Slide

  25. • O B

    • B
    • P D AP
    • D
    • P


    • J
    • . e e
    • D B J
    • Wb

    View Slide

  26. .

    View Slide

  27. • )
    • )
    • ( )


    • C I



    View Slide

  28. • ( ) -
    • ( ( (

    View Slide


  29. View Slide

  30. c
    • n o tp c a J ejr E e e
    • n o tp e D e
    • n o tp I jr f
    • ) ) () 3 ) a t
    • ) ) ( ( d f

    View Slide

  31. C B
    • c e E J
    • M a FJ
    • d J
    • 3 J

    View Slide

  32. 1.
    • H UaS
    u
    • f I gJ jP
    • L
    • 7 _ - -
    • vR WE c T
    WE T c D?

    View Slide