9
Spock Framework писать тесты просто Aндрей Малыхин, Яндекс

Spock Framework (Java Day BY 2015)

Embed Size (px)

Citation preview

Page 1: Spock Framework (Java Day BY 2015)

Spock Frameworkписать тесты просто

Aндрей Малыхин, Яндекс

Page 2: Spock Framework (Java Day BY 2015)

Spock Framework

2

Specification testing framework for Java and Groovy applications.

Page 3: Spock Framework (Java Day BY 2015)

BDD testing?!

3

BDD = TDD + (Dan North + “standard agile framework”)

User story: “As a [role] I want [feature] so that [benefit]”

Test scenario: given [initial context], when [event occurs], then [ensure some outcomes]

Page 4: Spock Framework (Java Day BY 2015)

public class SuperTypeForGeneratedTestCase { private Author createAuthor() throws InstantiationException, IllegalAccessException { Author author = EasyMock.createNiceMock(AuthorParent.class); EasyMock.expect(author.getName()).andReturn("Khalil Gebran").anyTimes(); EasyMock.replay(author); return author; } private Book createBook() throws InstantiationException, IllegalAccessException { Book book = EasyMock.createNiceMock(BookParent.class); EasyMock.expect(book.getTitle()).andReturn("The Prophet").anyTimes(); Author author = createAuthor(); EasyMock.expect(book.getAuthor()).andReturn(author).anyTimes(); EasyMock.replay(book); return book; } private Library createLibrary() throws InstantiationException, IllegalAccessException { Library lib = EasyMock.createNiceMock(LibraryParent.class); EasyMock.expect(lib.getTitle()).andReturn("Test Library").anyTimes(); List<Book> books = new ArrayList<Book>(); Book book = createBook(); books.add(book); EasyMock.expect(lib.getBooks()).andReturn(books).anyTimes(); EasyMock.replay(lib); return lib; } @Test public void testSuperTypeMappingForInaccessibleClasses() throws Exception { MapperFactory factory = MappingUtil.getMapperFactory(); Library lib = createLibrary(); Book book = lib.getBooks().get(0); LibraryDTO mappedLib = factory.getMapperFacade(Library.class, LibraryDTO.class).map(lib); Assert.assertNotNull(mappedLib); Assert.assertEquals(lib.getTitle(),mappedLib.getTitle()); Assert.assertEquals(book.getTitle(),mappedLib.getBooks().get(0).getTitle()); Assert.assertEquals(book.getAuthor().getName(),mappedLib.getBooks().get(0).getAuthor().getName()); } }

Проблема?

Page 5: Spock Framework (Java Day BY 2015)

public class SuperTypeForGeneratedTestCase { private Author createAuthor() throws InstantiationException, IllegalAccessException { Author author = EasyMock.createNiceMock(AuthorParent.class); EasyMock.expect(author.getName()).andReturn("Khalil Gebran").anyTimes(); EasyMock.replay(author); return author; } private Book createBook() throws InstantiationException, IllegalAccessException { Book book = EasyMock.createNiceMock(BookParent.class); EasyMock.expect(book.getTitle()).andReturn("The Prophet").anyTimes(); Author author = createAuthor(); EasyMock.expect(book.getAuthor()).andReturn(author).anyTimes(); EasyMock.replay(book); return book; } private Library createLibrary() throws InstantiationException, IllegalAccessException { Library lib = EasyMock.createNiceMock(LibraryParent.class); EasyMock.expect(lib.getTitle()).andReturn("Test Library").anyTimes(); List<Book> books = new ArrayList<Book>(); Book book = createBook(); books.add(book); EasyMock.expect(lib.getBooks()).andReturn(books).anyTimes(); EasyMock.replay(lib); return lib; } @Test public void testSuperTypeMappingForInaccessibleClasses() throws Exception { MapperFactory factory = MappingUtil.getMapperFactory(); Library lib = createLibrary(); Book book = lib.getBooks().get(0); LibraryDTO mappedLib = factory.getMapperFacade(Library.class, LibraryDTO.class).map(lib); Assert.assertNotNull(mappedLib); Assert.assertEquals(lib.getTitle(),mappedLib.getTitle()); Assert.assertEquals(book.getTitle(),mappedLib.getBooks().get(0).getTitle()); Assert.assertEquals(book.getAuthor().getName(),mappedLib.getBooks().get(0).getAuthor().getName()); } }

class SuperTypeForGeneratedSpec extends Specification { def "mapping by supper type should work for inaccessible class"() { given: def factory = MappingUtil.getMapperFactory() and: def lib = Mock(Model.LibraryParent) { getTitle() >> 'Test Library' getBooks() >> [Mock(Model.Book) { getTitle() >> 'The Prophet' getAuthor() >> Mock(Model.Author) { getName() >> 'Khalil Gebran' } }] }; when: def actual = factory.getMapperFacade(Model.Library,Model.LibraryDTO).map(lib) then: actual actual.title == lib.title actual.books[0].title == lib.books[0].title actual.books[0].author.name == lib.books[0].author.name }}

How can we do better?

Page 6: Spock Framework (Java Day BY 2015)

Demo

Page 7: Spock Framework (Java Day BY 2015)

Go to Production

7

on Groovy & Spock

We start to write tests…

Page 8: Spock Framework (Java Day BY 2015)

Live long and prosper.

@katoquro bitbucket.org/katoquro/spock-demo

Page 9: Spock Framework (Java Day BY 2015)

Ссылки

〉Spock Framework Docs bit.ly/spock-docs-1

〉Spock Framework Source github.com/spockframework

〉Demo Code bitbucket.org/katoquro/spock-demo

〉Star Trek TOS bit.ly/star-trek-tos