Automated Testing In Java

9,055 views

Published on

This is the presentation slides for Automated Testing in Java done by Franz See for PinoyJUG (Oct 27, 2009)

Published in: Technology
1 Comment
5 Likes
Statistics
Notes
No Downloads
Views
Total views
9,055
On SlideShare
0
From Embeds
0
Number of Embeds
244
Actions
Shares
0
Downloads
191
Comments
1
Likes
5
Embeds 0
No embeds

No notes for slide

Automated Testing In Java

  1. 1. Automated Testing in Java By Franz See [email_address] http://twitter.com/franz_see
  2. 2. Problems? Regression Too much time Debugging Waiting for your build to finish Documentation that lies!
  3. 3. What is it? public class Image { public Image(String path) {...}; public MimeType getMimeType() {...}; public Dimension getDimension() {...}; } public class ImageTest extends TestCase { public void testGetMimeType() { Image jpegImage = new Image(“dummy.jpeg”); MimeType mimeType = jpegImage.getMimeType(); assertEquals(MimeType.JPEG, mimeType); } public void testGetDimension() { Image jpegImage = new Image(“dummy.jpeg”); Dimension dimension = jpegImage.getDimension(); assertEquals(new Dimension(400,600), dimension); } }
  4. 4. The Parts (part1) public class ImageTest extends TestCase { public void testGetMimeType() { // setup Image jpegImage = new Image(“dummy.jpeg”); // exercise MimeType mimeType = jpegImage.getMimeType(); // verify assertEquals(MimeType.JPEG, mimeType); } // implict teardown public void testGetDimension() { Image jpegImage = new Image(“dummy.jpeg”); Dimension dimension = jpegImage.getDimension(); assertEquals(new Dimension(400,600), dimension); } }
  5. 5. The Parts (part2) public class ImageTest extends TestCase { private Image jpegImage; protected void setUp() { super.setUp(); jpegImage = new Image(”dummy.jpeg”); } protected void tearDown() { jpegImage = null; super.tearDown(); } public void testGetMimeType() { MimeType mimeType = jpegImage.getMimeType(); assertEquals(MimeType.JPEG, mimeType); } public void testGetDimension() { Dimension dimension = jpegImage.getDimension(); assertEquals(new Dimension(400,600), dimension); } }
  6. 6. The Parts (part3) // name should be descriptive // i.e. test<MethodName>[Should] // i.e. test[Given][When][Then] public void testGetMimeType() { MimeType mimeType = jpegImage.getMimeType(); // [descriptive message,] <expected>, <actual> assertEquals(MimeType.JPEG, mimeType); }
  7. 7. Tips :: Creating Tests <ul><li>Should contain NO logic
  8. 8. One assert per test
  9. 9. One test logic per test body
  10. 10. Do not catch exceptions unless that's what you're testing </li></ul>
  11. 11. The Goal Name File functional unit unit integration Controller Service Repository DB My Vaction Pic C:Pics01.jpeg Upload should store in repo should persist in db should persist inputs should serve requests
  12. 12. Functional Testing <ul><li>Tests the application as a whole
  13. 13. Regression for your application's features/ capability
  14. 14. Usually done by </li><ul><li>Driving the UI
  15. 15. Driving the layer just below the UI </li></ul><li>Goal </li><ul><li>To cover as much functionality
  16. 16. To be easy to read / write </li></ul></ul>
  17. 17. Unit Testing <ul><li>Testing the atomic parts of your code </li></ul>
  18. 18. Atomic Examples public Set select(Matcher matcher) { Set matchingObjects = new HashSet(); for(Object candidate : this.source) { if(matcher.matches(candidate)) { matchingObjects.add(candidate); } } return matchingObjects; } public Person get(Long id) { Assert.notNull(id, “Should have id to retrieve a Person.”); return repo.get(id); }
  19. 19. Test Organization public class PersonManager { public void create(Person person) {…} public Person retrieve(Long id) {…} public void update(Person person) {…} public void delete(Long id) {...} }
  20. 20. Test Organization :: SUT public class Container { public Long add(Object newObject) {…} public Object get(Long id) {…} public void replace(Long id, Object replacement) {…} public void delete(Long id) {...} }
  21. 21. Test Organization :: Simple Test Per Class public class ContainerTest extends TestCase { public void testAdd() {...} public void testGet() {...} public void testReplace() {...} public void testDelete() {...} }
  22. 22. Test Organization :: Non-Simple Test Per Class public class ContainerTest extends TestCase { public void testGivenNonFull_WhenAdd_ThenPutInContainer() {…} public void testGivenFull_WhenAdd_ThenThrowException() {...} public void testGivenKnownId_WhenGet_ThenReturnObject() {…} public void testGivenUnknownId_WhenGet_ThenNull() {...} public void testGivenKnownId_WhenReplace_ThenRemoveAndAdd() {…} public void testGivenUnknownId_WhenReplace_ThenAdd() {...} public void testGivenKnownId_WhenDelete_ThenRemove() {…} public void testGivenUnknownId_WhenDelete_ThenThrowException() {...} }
  23. 23. Test Organization :: Test Per Fixture public class ContainerTest extends TestSuite { public static class GivenNonFull extends TestCase { public void testWhenAdd_ThenPutInContainer() {...} } public static class GivenFull extends TestCase { public void testWhenAdd_ThenThrowException() {...} } public static class GivenKnownId extends TestCase { public void testWhenGet_ThenReturnObject() {…} public void testWhenReplace_ThenRemoveAndAdd() {…} public void testWhenDelete_ThenRemove() {…} } public static class GivenUnknownId extends TestCase { public void testWhenGet_ThenNull() {...} public void testWhenReplace_ThenAdd() {...} public void testWhenDelete_ThenThrowException() {...} } }
  24. 24. Test Organization :: Test Per Feature public class ContainerTest extends TestCase { public static class WhenAdd extends TestCase { public void testGivenNonFull_ThenPutInContainer() {…} public void testGivenFull_ThenThrowException() {...} } public static class WhenGet extends TestCase { public void testGivenKnownId_ThenReturnObject() {…} public void testGivenUnknownId_ThenNull() {...} } public static class WhenReplace extends TestCase { public void testGivenKnownId_ThenRemoveAndAdd() {…} public void testGivenUnknownId_ThenAdd() {...} } public static class WhenDelete extends TestCase { public void testGivenKnownId_ThenRemove() {…} public void testGivenUnknownId_ThenThrowException() {...} } }
  25. 25. Tip :: Fixtures <ul><li>What if there are two types of fixtures, and each fixture has several states?
  26. 26. What about reusing fixtures in Non-Test Per Fixture? </li></ul><ul><li>Use creational patterns </li></ul>
  27. 27. Tip :: Fixtures (part2) public static class WhenTake extends TestCase { public void testGivenFoodCouponWithinPromoDates_ThenRetrieveFoodGift() { Coupon givenCoupon = new CouponBuilder() .for(CouponType.Food) .within(promoDate.start,promoDate.end) .build(); Gift gift = storeOutlet.take(givenCoupon); assertEquals(Gift.Food, gift); } public void testGivenFoodCouponOutsidePromoDates_ThenRetrieveNull() { Coupon givenCoupon = new CouponBuilder() .for(CouponType.Food) .outside(promoDate.start,promoDate.end) .build(); Gift gift = storeOutlet.take(givenCoupon); assertNull(gift); } }
  28. 28. Isolating your unit <ul><li>Test Doubles </li><ul><li>Dummies
  29. 29. Mocks
  30. 30. Stubs
  31. 31. Spies
  32. 32. Fakes </li></ul></ul>
  33. 33. Data Flow :: Code public Entity createEntity(Long id, String name) { return new Entity(id, name); }
  34. 34. Data Flow :: Diagram createEntity id name Entity processing
  35. 35. Data Flow :: Code public Entity createEntity(Long id, String name) { Entity entity = registry.contains(id) ? registry.get(id) : new Entity(id); entity.setName(name); registry.store(entity); return entity; }
  36. 36. Data Flow createEntity id name Entity processing contains(..) get(..) store(..) registry
  37. 37. Data Flow createEntity id name Entity processing contains(..) get(..) store(..) Direct Input Indirect Input Direct Output Indirect Output Collaborator registry
  38. 38. Test Doubles :: Dummies (part1) createEntity id name Entity processing contains(..) get(..) store(..) registry
  39. 39. Test Doubles :: Dummies (part2) private SystemUnderTest sut; private Registry registry; protected void setUp() { super.setUp(); registry = new RegistryImpl(); sut.setRegistry(registry); } … public void testCreateEntity() { Long givenDummyId = -1L; String givenDummyName = “dummy name”; Entity entity = createEntity(givenDummyId, givenDummyName); assertEquals(“Should have set name of entity.”, givenDummyName, entity.getName()); }
  40. 40. Test Doubles :: Mocks (part1) createEntity id name Entity processing contains(..) get(..) store(..) registry
  41. 41. Test Doubles :: Mocks (part2) ... protected void setUp() { super.setUp(); registry = Mockito.mock(Registry.class); sut.setRegistry(registry); } … public void testCreateEntity() { Long givenContainedId = 10L; String givenDummyName = “dummy name”; Entity containedEntity = new Entity(givenContainedId, givenDummyName); doReturn(containedEntity).when(registry).get(givenContainedId). Entity entity = createEntity(givenContainedId, givenDummyName); assertEquals(“Should retrieved contained entity.”, containedEntity, entity); verify(registry).store( containedEntity ); }
  42. 42. Test Doubles :: Stubs (part1) createEntity id name Entity processing contains(..) get(..) store(..) registry
  43. 43. Test Doubles :: Stubs (part2) public class RegistryStub implements Registry { private final boolean contains; private final Entity containedEntity; public Registry(boolean contains, Entity containedEntity) { this.contains = contains; this.cachedEntity = containedEntity; } public boolean contains(Long id) { return contains; } public Entity get(Long id) { return containedEntity; } public void store(Entity enitty) {} }
  44. 44. Test Doubles :: Stubs (part3) ... private Entity containedEntity; ... protected void setUp() { super.setUp(); containedEntity = new Entity(); registry = new RegistryStub(true, containedEntity); sut.setRegistry(registry); } … public void testCreateEntity() { Long givenContainedId = 10L; String givenDummyName = “dummy name”; Entity entity = createEntity(givenContainedId, givenDummyName); assertSame(“Should retrieved contained entity.”, containedEntity, entity); }
  45. 45. Test Doubles :: Spies (part1) createEntity id name Entity processing contains(..) get(..) store(..) registry
  46. 46. Test Doubles :: Spies (part2) public class RegistrySpy implements Registry { private Entity storedEntity; public boolean contains(Long id) { return false; } public Entity get(Long id) { return null; } public void store(Entity entity) { storedEntity = entity; } public Entity getStoredEntity() { return storedEntity; } }
  47. 47. Test Doubles :: Spies (part3) ... protected void setUp() { super.setUp(); registry = new RegistrySpy(); sut.setRegistry(registry); } … public void testCreateEntity() { Long givenContainedId = 10L; String givenDummyName = “dummy name”; Entity entity = createEntity(givenContainedId, givenDummyName); assertNotNull(“Should have stored entity.”, registry.getStoredEntity()); }
  48. 48. Test Doubles :: Fakes (part1) createEntity id name Entity processing contains(..) get(..) store(..) registry
  49. 49. Test Doubles :: Fakes (part2) public class FakeRegistry implements Registry { private final Map<Long,Entity> container; public FakeRegistry(Entity containedEntity) { store(containedEntity); } public boolean contains(Long id) { return container.containsKey(id); } public Entity get(Long id) { return container.get(id); } public void store(Entity entity) { container.put(entity.getId(), entity); } }
  50. 50. Test Doubles :: Fakes (part3) ... private Entity storedEntity; ... protected void setUp() { super.setUp(); storedEntity = new Entity(10L); registry = new FakeRegistry(storedEntity); sut.setRegistry(registry); } … public void testCreateEntity() { Long givenContainedId = storedEntity.getId(); String givenDummyName = “dummy name”; Entity entity = createEntity(givenContainedId, givenDummyName); assertSame(“Should have retrieved contained entity.”, storedEntity, entity); }
  51. 51. Integration Testing <ul><li>When units interact with external dependencies </li><ul><li>Database
  52. 52. Filesystem
  53. 53. Other applications/services
  54. 54. Time
  55. 55. Etc </li></ul><li>Although external dependencies can be replaced by Test Doubles, tests might mean nothing if you do so. </li></ul>
  56. 56. Tip :: which test to start from <ul><li>Go for top-down approach </li></ul>
  57. 57. When should you write tests <ul><li>Test Last Development </li><ul><li>When you just want to bolt down whatever you've just finished </li></ul><li>Test First Development </li><ul><li>YAGNI
  58. 58. KISS </li></ul></ul>
  59. 59. When should you write tests <ul><li>Test Driven Design </li><ul><li>TFD + Refactor
  60. 60. Refactoring </li><ul><li>Technical
  61. 61. Domain </li></ul><li>Method level – results to simplest algorithm
  62. 62. Class level – results to simplest model </li></ul></ul>
  63. 63. TicTacToe TicTacToeTest T:14 F:0 E:0 S:14
  64. 64. TicTacToe TicTacToeTest T: 16 F:0 E:0 S: 16 TicTacToe
  65. 65. TicTacToe TicTacToeTest T: 14 F:0 E:0 S: 14 TicTacToe
  66. 66. TicTacToe TicTacToeTest T: 16 F:0 E:0 S: 16 TicTacToe
  67. 67. TicTacToe TicTacToeTest T:16 F:0 E:0 S: 14 TicTacToe Compile Error
  68. 68. TicTacToe TicTacToeTest T:16 F: 1 E:0 S:14 TicTacToe +move(..) +getBoard() GameOverException Board MarkedPosition Mark
  69. 69. TicTacToe TicTacToeTest T:16 F:1 E:0 S:14 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) MarkedPosition Mark
  70. 70. TicTacToe TicTacToeTest T:16 F:1 E:0 S:14 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) MarkedPosition BoardTest T:1 F:1 E:0 S:0 Mark
  71. 71. TicTacToe TicTacToeTest T:16 F: 0 E:0 S:14 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +equals(..) +hashCode() +toString() MarkedPosition +getEffectiveColumn() +getEffectiveRow() +getMark() BoardTest T: 1 F: 0 E:0 S:0 Mark
  72. 72. TicTacToe TicTacToeTest T:16 F: 0 E:0 S: 12 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +equals(..) +hashCode() +toString() MarkedPosition +getEffectiveColumn() +getEffectiveRow() +getMark() BoardTest T: 1 F: 0 E:0 S:0 Compile Error IllegalMoveException Mark
  73. 73. TicTacToe TicTacToeTest T:16 F: 1 E:0 S:12 TicTacToe +move(..) +getBoard() GameOverException MarkedPosition +getEffectiveColumn() +getEffectiveRow() +getMark() +getPosition() BoardTest T:1 F:0 E:0 S:0 IllegalMoveException Position Mark Board +set(..) +contains(..) +equals(..) +hashCode() +toString()
  74. 74. TicTacToe TicTacToeTest T:16 F:1 E:0 S:12 TicTacToe +move(..) +getBoard() GameOverException MarkedPosition +getEffectiveColumn() +getEffectiveRow() +getMark() +getPosition() BoardTest T: 3 F:0 E:0 S: 2 IllegalMoveException Position Mark Board +set(..) +contains(..) +equals(..) +hashCode() +toString()
  75. 75. TicTacToe TicTacToeTest T:16 F:1 E:0 S:12 TicTacToe +move(..) +getBoard() GameOverException MarkedPosition +getEffectiveColumn() +getEffectiveRow() +getMark() +getPosition() BoardTest T: 3 F:0 E:0 S: 2 IllegalMoveException Position Mark Board +set(..) +contains(..) +equals(..) +hashCode() +toString()
  76. 76. TicTacToe TicTacToeTest T:16 F:1 E:0 S:12 TicTacToe +move(..) +getBoard() GameOverException MarkedPosition +getEffectiveColumn() +getEffectiveRow() +getMark() +getPosition() BoardTest T:3 F: 1 E:0 S: 0 IllegalMoveException Position Mark Board +set(..) +contains(..) +equals(..) +hashCode() +toString()
  77. 77. TicTacToe TicTacToeTest T:16 F:1 E:0 S:12 TicTacToe +move(..) +getBoard() GameOverException MarkedPosition +getEffectiveColumn() +getEffectiveRow() +getMark() +getPosition() BoardTest T:3 F:1 E:0 S:0 IllegalMoveException Position +equals(..) +hashCode() +toString() Mark Board +set(..) +contains(..) +equals(..) +hashCode() +toString()
  78. 78. TicTacToe TicTacToeTest T:16 F: 0 E:0 S:12 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getEffectiveColumn() +getEffectiveRow() +getMark() +getPosition() BoardTest T:3 F: 0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark
  79. 79. TicTacToe TicTacToeTest T:16 F:0 E:0 S:12 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:3 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark
  80. 80. TicTacToe TicTacToeTest T: 17 F:0 E: 1 S: 11 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:3 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark
  81. 81. TicTacToe TicTacToeTest T:17 F:0 E:1 S:11 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:3 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark
  82. 82. TicTacToe TicTacToeTest T:17 F:0 E:1 S:11 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:3 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Compile Error Compile Error
  83. 83. TicTacToe TicTacToeTest T:17 F:0 E:1 S:11 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:3 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark
  84. 84. TicTacToe TicTacToeTest T:17 F:0 E:1 S:11 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T: 5 F: 1 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark
  85. 85. TicTacToe TicTacToeTest T:17 F: 1 E: 15 S:11 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:5 F: 0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark
  86. 86. TicTacToe TicTacToeTest T:17 F: 0 E: 0 S:11 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:5 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark
  87. 87. TicTacToe TicTacToeTest T: 19 F: 2 E:0 S:11 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:5 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark
  88. 88. TicTacToe TicTacToeTest T:19 F: 0 E:0 S:11 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:5 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark
  89. 89. TicTacToe TicTacToeTest T:19 F:0 E:0 S: 10 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:5 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark
  90. 90. TicTacToe TicTacToeTest T: 18 F:0 E:0 S:10 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:5 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark
  91. 91. TicTacToe TicTacToeTest T:18 F:0 E:0 S: 9 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:5 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Compile Error Compile Error
  92. 92. TicTacToe TicTacToeTest T:18 F: 1 E:0 S:9 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:5 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result
  93. 93. TicTacToe TicTacToeTest T:18 F: 0 E:0 S:9 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:5 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result
  94. 94. TicTacToe TicTacToeTest T:18 F:0 E:0 S: 8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:5 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Compile Error Compile Error
  95. 95. TicTacToe TicTacToeTest T:18 F: 1 E:0 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:5 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result
  96. 96. TicTacToe TicTacToeTest T:18 F:1 E:0 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:5 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Compile Error Compile Error
  97. 97. TicTacToe TicTacToeTest T:18 F: 0 E: 14 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:5 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +areAllTheSame()
  98. 98. TicTacToe TicTacToeTest T:18 F:0 E:14 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T: 6 F:0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Compile Error Compile Error Line +areAllTheSame()
  99. 99. TicTacToe TicTacToeTest T:18 F:0 E:14 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:6 F: 1 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +areAllTheSame()
  100. 100. TicTacToe TicTacToeTest T:18 F: 1 E: 0 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:6 F:1 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +areAllTheSame()
  101. 101. TicTacToe TicTacToeTest T:18 F:1 E:0 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() BoardTest T:6 F: 0 E:0 S:0 IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +areAllTheSame() +equals(..) +hashCode() +toString()
  102. 102. TicTacToe TicTacToeTest T:18 F:1 E:0 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line + isStraight () +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:2 F:0 E:0 S:0
  103. 103. TicTacToe TicTacToeTest T:18 F:1 E:0 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:2 F: 1 E:0 S:0
  104. 104. TicTacToe TicTacToeTest T:18 F:1 E:0 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:2 F: 0 E:0 S:0
  105. 105. TicTacToe TicTacToeTest T:18 F:1 E:0 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:2 F:0 E:0 S:0
  106. 106. TicTacToe TicTacToeTest T:18 F:1 E:0 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:2 F:0 E:0 S:0 Compile Error Compile Error
  107. 107. TicTacToe TicTacToeTest T:18 F:1 E:0 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:2 F:0 E:0 S:0
  108. 108. TicTacToe TicTacToeTest T:18 F:1 E:0 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() + isMarkedTheSame () +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T: 6 F: 3 E:0 S:0
  109. 109. TicTacToe TicTacToeTest T:18 F: 0 E:0 S:8 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() + isMarkedTheSame () +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T: 6 F: 0 E:0 S:0
  110. 110. TicTacToe TicTacToeTest T:18 F: 1 E:0 S: 7 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() + isMarkedTheSame () +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:6 F:0 E:0 S:0
  111. 111. TicTacToe TicTacToeTest T:18 F:1 E:0 S:7 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() + isMarkedTheSame () +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T: 7 F: 1 E:0 S:0
  112. 112. TicTacToe TicTacToeTest T:18 F: 0 E:0 S:7 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:7 F:1 E:0 S:0
  113. 113. TicTacToe TicTacToeTest T:18 F:0 E:0 S:7 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:7 F: 0 E:0 S:0
  114. 114. TicTacToe TicTacToeTest T:18 F: 1 E: 1 S: 5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:7 F:0 E:0 S:0
  115. 115. TicTacToe TicTacToeTest T:18 F:1 E:1 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T: 9 F: 2 E:0 S:0
  116. 116. TicTacToe TicTacToeTest T:18 F:1 E:1 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:9 F:2 E:0 S:0 Compile Error Compile Error
  117. 117. TicTacToe TicTacToeTest T:18 F:1 E:1 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:9 F:2 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 Compile Error Compile Error
  118. 118. TicTacToe TicTacToeTest T:18 F:1 E:1 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:9 F:2 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 Compile Error Compile Error NumberUtil +getOrder(..)
  119. 119. TicTacToe TicTacToeTest T:18 F:1 E:1 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:9 F:2 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 Compile Error Compile Error NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  120. 120. TicTacToe TicTacToeTst T:18 F: 2 E: 0 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:9 F: 0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  121. 121. TicTacToe TicTacToeTest T:18 F: 3 E:0 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:9 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  122. 122. TicTacToe TicTacToeTest T:18 F:3 E:0 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:6 F:0 E:0 S:0 LineTest T:9 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0 Compile Error Compile Error
  123. 123. TicTacToe TicTacToeTest T:18 F:3 E:0 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T: 7 F:0 E:0 S:0 LineTest T:9 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0 Compile Error Compile Error
  124. 124. TicTacToe TicTacToeTest T:18 F: 0 E: 14 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getColumn(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:7 F: 1 E:0 S:0 LineTest T:9 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  125. 125. TicTacToe TicTacToeTest T:18 F: 2 E: 0 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getColumn(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:7 F: 0 E:0 S:0 LineTest T:9 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  126. 126. TicTacToe TicTacToeTest T:18 F:2 E:0 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getColumn(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:7 F:0 E:0 S:0 LineTest T:9 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0 Compile Error Compile Error
  127. 127. TicTacToe TicTacToeTest T:18 F: 0 E: 14 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getColumn(..) +getDiagonals(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:7 F:0 E:0 S:0 LineTest T:9 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  128. 128. TicTacToe TicTacToeTest T:18 F:0 E:14 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getColumn(..) +getDiagonals(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T: 11 F:0 E: 4 S:0 LineTest T:9 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  129. 129. TicTacToe TicTacToeTest T:18 F:0 E: 0 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getColumn(..) +getDiagonals(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:11 F:0 E: 0 S:0 LineTest T:9 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  130. 130. TicTacToe TicTacToeTest T:18 F:0 E:0 S:5 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getColumn(..) +getDiagonals(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:11 F:0 E:0 S:0 LineTest T: 4 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  131. 131. TicTacToe TicTacToeTest T:18 F: 1 E:0 S: 3 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getColumn(..) +getDiagonals(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:11 F:0 E:0 S:0 LineTest T:4 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  132. 132. TicTacToe TicTacToeTest T:18 F: 0 E:0 S:3 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getColumn(..) +getDiagonals(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:11 F:0 E:0 S:0 LineTest T:4 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  133. 133. TicTacToe TicTacToeTest T:18 F:0 E:0 S: 1 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getColumn(..) +getDiagonals(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:11 F:0 E:0 S:0 LineTest T:4 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  134. 134. TicTacToe TicTacToeTest T:18 F: 1 E:0 S: 0 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getColumn(..) +getDiagonals(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:11 F:0 E:0 S:0 LineTest T:4 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  135. 135. TicTacToe TicTacToeTest T:18 F: 0 E:0 S:0 TicTacToe +move(..) +getBoard() GameOverException Board +set(..) +isMarked(..) +contains(..) +getColumn(..) +getDiagonals(..) +getRow(..) +equals(..) +hashCode() +toString() MarkedPosition +getMark() +getPosition() +equals(..) +hashCode() +toString() +compareTo(..) IllegalMoveException Position +getEffectiveColumn() +getEffectiveRow() +equals(..) +hashCode() +toString() Mark Result Line +isStraight() +isMarkedTheSame() +equals(..) +hashCode() +toString() BoardTest T:11 F:0 E:0 S:0 LineTest T:4 F:0 E:0 S:0 NumberUtilTest T:3 F:0 E:0 S:0 NumberUtil +getOrder(..) MarkedPositionTest T:5 F:0 E:0 S:0
  136. 136. Thank you ^_^
  137. 137. References <ul><li>Xunit Test Patterns
  138. 138. Working Effectively with Legacy Code
  139. 139. http://www.mockobjects.com/
  140. 140. http://tech.groups.yahoo.com/group/testdrivendevelopment/
  141. 141. http://sites.google.com/site/tddproblems/
  142. 142. http://code.google.com/p/tic-tac-toe-tdd/
  143. 143. http://code.google.com/p/appfuse-top-to-bottom-tdd/ </li></ul>

×