Test du futur avec Spock

download Test du futur avec Spock

If you can't read please download the document

Transcript of Test du futur avec Spock

Prsentation PowerPoint

LEMEE MathildeIndpendanteEmail : [email protected] : @MathildeLemeeLinkedIn : http://fr.linkedin.com/in/MathildeLemeeBlog : http://www.java-freelance.frTests du futur avec Spock

Problmatique

Spock

Pas que du mockTest full stack

def "stack should push"(){

given:

def stack = new Stack();

def elem = "push me"

when:

stack.push(elem)

then:

!stack.empty

stack.size() == 1

stack.peek() == elem

}

Exemple 1

Map dummyData;

public UserService() {

dummyData = new HashMap();

dummyData.put("user1", new User("John", "Doe", 123456));

dummyData.put("user2", new User("Jane", "Doe", 654321));

dummyData.put("user3", new User("John", "Smith", 789987));}

public User get(String username) {

return dummyData.get(username);}

Pour les prochains slides voil la mthode sur laquelle nous allons nous appuyer

public void userShouldBeWellFilled() {

given:

UserService service = new UserService()

when:

User user = service.get("user1")

then:

user.firstName == 'John'

user.lastName == 'Doe'

user.id == 123456}

}

Exemple 2 simple

Blocs

given = setup

when then ou expect

where

cleanup

when:

def x = Math.max(1, 2)

then:

x == 2

expect:

Math.max(1, 2) == 2

Equivalent Spock - jUnit

setup() @Before

cleanup() @After

setupSpec() @BeforeClass

cleanupSpec() @AfterClass

setup

SecurityService securityService;

UserService service;

def setup() {

securityService = Mock(SecurityService)

service = new UserService()

service.securityService = securityService

}

Rappel

Stub = Bouchon = Stupide

=> Test d'tat

Mock = Simulacre = Intelligent

=> Test comportement

public User getManager(String username) {

User manager = securityService.getManager(username);

if (manager == null) {

manager = dummyData.get("user1");

}

return manager;

}

+ Spock

securityService.getManager("user2")>>new User(firstName: "John", lastName: "Smith", id: 789986)

securityService.getManager("user2")

>>>[new User("John"),new User("J")]

Stub

given:

securityService.getManager("user2")>>new User("John", "Smith",789986)

when:

User manager = service.getManager("user2")

then:

manager.id==789986

Interaction

mock.receive()

mock.receive(_)

mock.receive(!null)

mock.receive(event)

mock.receive(!event)

mock.receive(_ as Message)

mock./set.*/(_)

def "getManager should securityService.getManager"() {

when:

service.getManager "user1"

then:

1*securityService.getManager (_)

Cardinalit

1 *

(n.._)

(_..n)

0 * _

Argument Matcher

public Boolean auditByUser(String username) {

User user = dummyData.get(username);

return securityService.hasAccess(user);

}

@Test

public void testArgumentMatcher() {

userService.auditByUser("user1");

verify(securityService).hasAccess(argThat(new isUserId123456()));

}

class isUserId123456 extends ArgumentMatcher {

public boolean matches(Object object) {

return ((User) object).getId() == 123456;

}}

when:

service.auditByUser("user1")

then:

1*securityService.hasAccess {it.id==123456}

}

Exceptions

@Test(expected = RuntimeException.class)

public void testRuntimeExceptionShouldNotBeCatch() {

when(userService.getManager("user1")).thenThrow(new RuntimeException());

userService.getManager("user1");

}

securityService.getManager("user2")>>{throw new RuntimeException()}

when:

service.getManager("user2")

then:

thrown(RuntimeException)

Exceptions

>> {throw }

thrown / notThrown

@FailsWith

Data Driven Testing

def "user should be well filed"() {

setup:

User service = new UserService()

expect:

User user = service.get(username)

user.firstName == firstname

user.id == userID

where:

username