Automated Testing In Java

Embed Size (px)

Citation preview

Automated Testing in Java

By Franz [email protected]://twitter.com/franz_see

Problems?

Regression

Too much time Debugging

Waiting for your build to finish

Documentation that lies!

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); }}

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); }}

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); }}

The Parts (part3)

// name should be descriptive // i.e. test[Should] // i.e. test[Given][When][Then] public void testGetMimeType() {

MimeType mimeType = jpegImage.getMimeType();

// [descriptive message,] , assertEquals(MimeType.JPEG, mimeType); }

Tips :: Creating Tests

Should contain NO logic

One assert per test

One test logic per test body

Do not catch exceptions unless that's what you're testing

The Goal

ControllerServiceRepositoryDBMy Vaction PicC:\Pics\001.jpegName

File

Uploadshould store in repo

should persist in db

should persistinputs

should serverequests

functional

unit

unit

integration

Functional Testing

Tests the application as a whole

Regression for your application's features/ capability

Usually done byDriving the UI

Driving the layer just below the UI

GoalTo cover as much functionality

To be easy to read / write

Unit Testing

Testing the atomic parts of your code

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);}

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) {...}

}

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) {...}

}

Test Organization ::
Simple Test Per Class

public class ContainerTest extends TestCase {

public void testAdd() {...}

public void testGet() {...}

public void testReplace() {...}

public void testDelete() {...}

}

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() {...}}

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() {...} }}

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() {...} }}

Tip :: Fixtures

What if there are two types of fixtures, and each fixture has several states?

What about reusing fixtures in Non-Test Per Fixture?

Use creational patterns

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); }}

Isolating your unit

Test DoublesDummies

Mocks

Stubs

Spies

Fakes

Data Flow :: Code

public Entity createEntity(Long id, String name) { return new Entity(id, name);}

Data Flow :: Diagram

createEntity

id

name

Entity

processing

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;}

Data Flow

createEntity

id

name

Entity

processing

registry

contains(..)

get(..)

store(..)

Data Flow

createEntity

id

name

Entity

processing

registry

contains(..)

get(..)

store(..)

Direct Input

Indirect Input

Direct Output

Indirect Output

Collaborator

Test Doubles :: Dummies (part1)

createEntity

id

name

Entity

processing

registry

contains(..)

get(..)

store(..)

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());}

Test Doubles :: Mocks (part1)

createEntity

id

name

Entity

processing

registry

contains(..)

get(..)

store(..)

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);}

Test Doubles :: Stubs (part1)

createEntity

id

name

Entity

processing

registry

contains(..)

get(..)

store(..)

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) {}}

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);}

Test Doubles :: Spies (part1)

createEntity

id

name

Entity

processing

registry

contains(..)

get(..)

store(..)

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; }}

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());}

Test Doubles :: Fakes (part1)

createEntity

id

name

Entity

processing

registry

contains(..)

get(..)

store(..)

Test Doubles :: Fakes (part2)

public class FakeRegistry implements Registry { private final Map 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); }}

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);}

Integration Testing

When units interact with external dependenciesDatabase

Filesystem

Other applications/services

Time

Etc

Although external dependencies can be replaced by Test Doubles, tests might mean nothing if you do so.

Tip :: which test to start from

Go for top-down approach

When should you write tests

Test Last DevelopmentWhen you just want to bolt down whatever you've just finished

Test First DevelopmentYAGNI

KISS

When should you write tests

Test Driven DesignTFD + Refactor

RefactoringTechnical

Domain

Method level results to simplest algorithm

Class level results to simplest model

TicTacToe

TicTacToeTestT:14 F:0 E:0 S:14

TicTacToe

TicTacToeTestT:16 F:0 E:0 S:16TicTacToe

TicTacToe

TicTacToeTestT:14 F:0 E:0 S:14TicTacToe

TicTacToe

TicTacToeTestT:16 F:0 E:0 S:16TicTacToe

TicTacToe

TicTacToeTestT:16 F:0 E:0 S:14TicTacToeCompile Error

TicTacToe

TicTacToeTestT:16 F:1 E:0 S:14TicTacToe+move(..)+getBoard()GameOverExceptionBoardMarkedPositionMark

TicTacToe

TicTacToeTestT:16 F:1 E:0 S:14TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)MarkedPosition

Mark

TicTacToe

TicTacToeTestT:16 F:1 E:0 S:14TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)MarkedPositionBoardTestT:1 F:1 E:0 S:0

Mark

TicTacToe

TicTacToeTestT:16 F:0 E:0 S:14TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+equals(..)+hashCode()+toString()

MarkedPosition+getEffectiveColumn()+getEffectiveRow()+getMark()BoardTestT:1 F:0 E:0 S:0

Mark

TicTacToe

TicTacToeTestT:16 F:0 E:0 S:12TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+equals(..)+hashCode()+toString()

MarkedPosition+getEffectiveColumn()+getEffectiveRow()+getMark()BoardTestT:1 F:0 E:0 S:0

Compile ErrorIllegalMoveExceptionMark

TicTacToe

TicTacToeTestT:16 F:1 E:0 S:12TicTacToe+move(..)+getBoard()GameOverExceptionMarkedPosition+getEffectiveColumn()+getEffectiveRow()+getMark()+getPosition()BoardTestT:1 F:0 E:0 S:0IllegalMoveExceptionPositionMark

Board+set(..)+contains(..)+equals(..)+hashCode()+toString()

TicTacToe

TicTacToeTestT:16 F:1 E:0 S:12TicTacToe+move(..)+getBoard()GameOverExceptionMarkedPosition+getEffectiveColumn()+getEffectiveRow()+getMark()+getPosition()BoardTestT:3 F:0 E:0 S:2IllegalMoveExceptionPositionMark

Board+set(..)+contains(..)+equals(..)+hashCode()+toString()

TicTacToe

TicTacToeTestT:16 F:1 E:0 S:12TicTacToe+move(..)+getBoard()GameOverExceptionMarkedPosition+getEffectiveColumn()+getEffectiveRow()+getMark()+getPosition()BoardTestT:3 F:0 E:0 S:2IllegalMoveExceptionPositionMark

Board+set(..)+contains(..)+equals(..)+hashCode()+toString()

TicTacToe

TicTacToeTestT:16 F:1 E:0 S:12TicTacToe+move(..)+getBoard()GameOverExceptionMarkedPosition+getEffectiveColumn()+getEffectiveRow()+getMark()+getPosition()BoardTestT:3 F:1 E:0 S:0IllegalMoveExceptionPositionMark

Board+set(..)+contains(..)+equals(..)+hashCode()+toString()

TicTacToe

TicTacToeTestT:16 F:1 E:0 S:12TicTacToe+move(..)+getBoard()GameOverExceptionMarkedPosition+getEffectiveColumn()+getEffectiveRow()+getMark()+getPosition()BoardTestT:3 F:1 E:0 S:0IllegalMoveExceptionPosition+equals(..)+hashCode()+toString()Mark

Board+set(..)+contains(..)+equals(..)+hashCode()+toString()

TicTacToe

TicTacToeTestT:16 F:0 E:0 S:12TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getEffectiveColumn()+getEffectiveRow()+getMark()+getPosition()BoardTestT:3 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

TicTacToe

TicTacToeTestT:16 F:0 E:0 S:12TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:3 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

TicTacToe

TicTacToeTestT:17 F:0 E:1 S:11TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:3 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

TicTacToe

TicTacToeTestT:17 F:0 E:1 S:11TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:3 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

TicTacToe

TicTacToeTestT:17 F:0 E:1 S:11TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:3 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

Compile ErrorCompile Error

TicTacToe

TicTacToeTestT:17 F:0 E:1 S:11TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:3 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

TicTacToe

TicTacToeTestT:17 F:0 E:1 S:11TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:1 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

TicTacToe

TicTacToeTestT:17 F:1 E:15 S:11TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

TicTacToe

TicTacToeTestT:17 F:0 E:0 S:11TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

TicTacToe

TicTacToeTestT:19 F:2 E:0 S:11TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

TicTacToe

TicTacToeTestT:19 F:0 E:0 S:11TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

TicTacToe

TicTacToeTestT:19 F:0 E:0 S:10TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

TicTacToe

TicTacToeTestT:18 F:0 E:0 S:10TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

TicTacToe

TicTacToeTestT:18 F:0 E:0 S:9TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

Compile ErrorCompile Error

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:9TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

Result

TicTacToe

TicTacToeTestT:18 F:0 E:0 S:9TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

Result

TicTacToe

TicTacToeTestT:18 F:0 E:0 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultCompile ErrorCompile Error

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

Result

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultCompile ErrorCompile Error

TicTacToe

TicTacToeTestT:18 F:0 E:14 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:5 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+areAllTheSame()

TicTacToe

TicTacToeTestT:18 F:0 E:14 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:6 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultCompile ErrorCompile ErrorLine+areAllTheSame()

TicTacToe

TicTacToeTestT:18 F:0 E:14 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:6 F:1 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+areAllTheSame()

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:6 F:1 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+areAllTheSame()

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()BoardTestT:6 F:0 E:0 S:0

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+areAllTheSame()+equals(..)+hashCode()+toString()

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:2 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:2 F:1 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:2 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:2 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:2 F:0 E:0 S:0Compile ErrorCompile Error

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:2 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:6 F:3 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:0 E:0 S:8TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:6 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:7TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:6 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:7TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:7 F:1 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:0 E:0 S:7TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:7 F:1 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:0 E:0 S:7TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:7 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:1 E:1 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:7 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:1 E:1 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:9 F:2 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:1 E:1 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:9 F:2 E:0 S:0Compile ErrorCompile Error

TicTacToe

TicTacToeTestT:18 F:1 E:1 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:9 F:2 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0Compile ErrorCompile Error

TicTacToe

TicTacToeTestT:18 F:1 E:1 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:9 F:2 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0Compile ErrorCompile ErrorNumberUtil+getOrder(..)

TicTacToe

TicTacToeTestT:18 F:1 E:1 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:9 F:2 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0Compile ErrorCompile ErrorNumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

TicTacToe

TicTacToeTstT:18 F:2 E:0 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:9 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:3 E:0 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:9 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:3 E:0 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:6 F:0 E:0 S:0LineTestT:9 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0Compile ErrorCompile Error

TicTacToe

TicTacToeTestT:18 F:3 E:0 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:7 F:0 E:0 S:0LineTestT:9 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0Compile ErrorCompile Error

TicTacToe

TicTacToeTestT:18 F:0 E:14 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getColumn(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:7 F:1 E:0 S:0LineTestT:9 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:2 E:0 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getColumn(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:7 F:0 E:0 S:0LineTestT:9 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:2 E:0 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getColumn(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:7 F:0 E:0 S:0LineTestT:9 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0Compile ErrorCompile Error

TicTacToe

TicTacToeTestT:18 F:0 E:14 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getColumn(..)+getDiagonals(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:7 F:0 E:0 S:0LineTestT:9 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:0 E:14 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getColumn(..)+getDiagonals(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:11 F:0 E:4 S:0LineTestT:9 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:0 E:0 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getColumn(..)+getDiagonals(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:11 F:0 E:0 S:0LineTestT:9 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:0 E:0 S:5TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getColumn(..)+getDiagonals(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:11 F:0 E:0 S:0LineTestT:4 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:3TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getColumn(..)+getDiagonals(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:11 F:0 E:0 S:0LineTestT:4 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:0 E:0 S:3TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getColumn(..)+getDiagonals(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:11 F:0 E:0 S:0LineTestT:4 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:0 E:0 S:1TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getColumn(..)+getDiagonals(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:11 F:0 E:0 S:0LineTestT:4 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:1 E:0 S:0TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getColumn(..)+getDiagonals(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:11 F:0 E:0 S:0LineTestT:4 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

TicTacToe

TicTacToeTestT:18 F:0 E:0 S:0TicTacToe+move(..)+getBoard()GameOverExceptionBoard+set(..)+isMarked(..)+contains(..)+getColumn(..)+getDiagonals(..)+getRow(..)+equals(..)+hashCode()+toString()

MarkedPosition+getMark()+getPosition()+equals(..)+hashCode()+toString()+compareTo(..)

IllegalMoveExceptionPosition+getEffectiveColumn()+getEffectiveRow()+equals(..)+hashCode()+toString()Mark

ResultLine+isStraight()+isMarkedTheSame()+equals(..)+hashCode()+toString()BoardTestT:11 F:0 E:0 S:0LineTestT:4 F:0 E:0 S:0NumberUtilTestT:3 F:0 E:0 S:0NumberUtil+getOrder(..)MarkedPositionTestT:5 F:0 E:0 S:0

Thank you ^_^

References

Xunit Test Patterns

Working Effectively with Legacy Code

http://www.mockobjects.com/

http://tech.groups.yahoo.com/group/testdrivendevelopment/

http://sites.google.com/site/tddproblems/

http://code.google.com/p/tic-tac-toe-tdd/

http://code.google.com/p/appfuse-top-to-bottom-tdd/