View
404
Download
2
Category
Preview:
Citation preview
Spock Frameworkписать тесты просто
Aндрей Малыхин, Яндекс
Spock Framework
2
Specification testing framework for Java and Groovy applications.
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]
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()); } }
Проблема?
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?
Demo
Go to Production
7
on Groovy & Spock
We start to write tests…
Live long and prosper.
@katoquro bitbucket.org/katoquro/spock-demo
Ссылки
〉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
Recommended