The document discusses various features of the Spring framework including EJB support, creating custom beans, JNDI lookup, remoting, JMS, and mail support. Spring can simplify creation of EJB session and message-driven beans. Custom beans can implement interfaces to define business logic. Spring supports lookup of resources through JNDI and exposing services via remoting protocols like RMI, HTTP invoker, and JMS. It also provides utilities for sending mail.
Tips for writing software that do not wake you up at 2am. A topic highly influenced by Michael T. Nygard's book Release It and lessons we've learnt at GoodData.
The document discusses various features of the Spring framework including EJB support, creating custom beans, JNDI lookup, remoting, JMS, and mail support. Spring can simplify creation of EJB session and message-driven beans. Custom beans can implement interfaces to define business logic. Spring supports lookup of resources through JNDI and exposing services via remoting protocols like RMI, HTTP invoker, and JMS. It also provides utilities for sending mail.
Tips for writing software that do not wake you up at 2am. A topic highly influenced by Michael T. Nygard's book Release It and lessons we've learnt at GoodData.
This document provides an overview of the Spring Integration framework. It discusses key concepts like channels, endpoints, routers, filters and transformers. It describes common integration scenarios like file transfer, database integration and messaging. The goals of Spring Integration are to provide a simple model for complex enterprise integration and facilitate asynchronous, message-driven behavior within Spring applications. An example demonstrates converting a message to uppercase using a service activator and channels.
* Jakým způsobem můžeme vystavovat aplikační logiku
* RPC versus výměna zpráv
* Rozdíl SOAP a REST služby, za jakých okolností bychom měli použít jedno nebo druhé
* Spring WS
* Návrh kontraktu
* Ukázka Endpointu
* Spring MVC REST
* Návrh REST resourcu
* Ukázka REST controlleru
The document discusses using MongoDB as an alternative to a relational database in Java applications. It outlines some of the drawbacks of using an ORM with an RDBMS, such as complexity in the data access layer. MongoDB offers a simpler document model where data is stored in JSON-like documents without a predefined schema. The presentation demonstrates basic CRUD operations in MongoDB from the Java driver and discusses architecture considerations like lack of transactions when using MongoDB. It also provides an example of how MongoDB is deployed in a clustered configuration for the GoodData platform.
The document discusses the author's experience with NoSQL databases from a Java developer perspective. Prototypes were created using Voldemort, CouchDB, and Neo4J. Implementing connectors for new databases required creating new Java classes, mappings, and DDL for each. CouchDB provides a simpler approach with three document types, a schemaless structure, elastic extensibility, and direct mapping between Java beans and JSON without an ORM or need for deep ORM knowledge.
This document provides an overview of the Spring Integration framework. It discusses key concepts like channels, endpoints, routers, filters and transformers. It describes common integration scenarios like file transfer, database integration and messaging. The goals of Spring Integration are to provide a simple model for complex enterprise integration and facilitate asynchronous, message-driven behavior within Spring applications. An example demonstrates converting a message to uppercase using a service activator and channels.
* Jakým způsobem můžeme vystavovat aplikační logiku
* RPC versus výměna zpráv
* Rozdíl SOAP a REST služby, za jakých okolností bychom měli použít jedno nebo druhé
* Spring WS
* Návrh kontraktu
* Ukázka Endpointu
* Spring MVC REST
* Návrh REST resourcu
* Ukázka REST controlleru
The document discusses using MongoDB as an alternative to a relational database in Java applications. It outlines some of the drawbacks of using an ORM with an RDBMS, such as complexity in the data access layer. MongoDB offers a simpler document model where data is stored in JSON-like documents without a predefined schema. The presentation demonstrates basic CRUD operations in MongoDB from the Java driver and discusses architecture considerations like lack of transactions when using MongoDB. It also provides an example of how MongoDB is deployed in a clustered configuration for the GoodData platform.
The document discusses the author's experience with NoSQL databases from a Java developer perspective. Prototypes were created using Voldemort, CouchDB, and Neo4J. Implementing connectors for new databases required creating new Java classes, mappings, and DDL for each. CouchDB provides a simpler approach with three document types, a schemaless structure, elastic extensibility, and direct mapping between Java beans and JSON without an ORM or need for deep ORM knowledge.
1. Spring framework
Motto: Musíte rozbít vejce když chcete udělat omeletu
Spring framework training materials by Roman Pichlík is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Sunday 13 May 2012 1
2. Spring framework
Motto: Musíte rozbít vejce když chcete udělat omeletu
Sunday 13 May 2012 2
8. Manuální testy
• Historicky běžná součást
vývojového procesu
• Testovací fáze
• Vývojáři nebo QA oddělení
Sunday 13 May 2012 8
9. Hlavní rysy
• Pomalé
• Drahé
• Neefektivní
• Náchylné k chybě lidského faktoru
Sunday 13 May 2012 9
Pomalé - trvání testovacího kolečka, specifikace, vlastní průchod testu
Drahé - lidský čas je oproti strojovému stále dražší (i v Bengalore)
Neefektivní - otestování low level změny je kolikrát nemožné
Lidský faktor - člověk je tvor líny, monotóní práce je ubijející (ne pro stroj)
10. Dopady manuálního testování
• Delší release cyklus
• Chyby se odhalí na konci
vývojového cyklu
• Problém chyba v RC
• Neškáluje
Sunday 13 May 2012 10
RC= Go nebo no Go nebo Hotfix díky tomu, že nám hoří termín
Neškáluje = nový tester neznamená větší otestovanost (roste i code base)
11. Automatické testy
• Píší se společně s kódem
• Kontinuální evoluce
• Různé testy podle úrovně
abstrakce a cílové oblasti
• Jednotkové
• Integrační
• Výkonové
Sunday 13 May 2012 11
12. Dopady aut. testů
• Rychlejší release cyklus
• Test coverage
• Známe slabá místa
• Umožňují lépe pochopit fungování
kódu
• Ukazují špatný/dobrý design
Sunday 13 May 2012 12
Rychlejší release cyklus díky testům závisí na tom jak drahé je pro nás testy psát a udržovat
14. Kolik stojí opravení chyby
Náklady na odstranění chyby
čas nalezení chyby
Sunday 13 May 2012 14
Náklady na odstranění rostou exponenciálně s čase objevení chyby
15. Kolik stojí opravení chyby
Náklady na odstranění chyby
čas nalezení chyby
automatické testy manuální testy
Sunday 13 May 2012 15
Náklady na odstranění rostou exponenciálně s čase objevení chyby
Automatické testy snižují čas na odhalení chyby
16. Doporučení
• Zaměřte se na automatické testy
• Testy lze zavádět inkrementálně
• Nový kód vždy
• Starý kód pokud se do něj šahá
• Starý kód podle důležitosti
• Testy jsou zrcadlem návrhu
Sunday 13 May 2012 16
18. Jednotkové vs. Integrační
• Jednotkové testy
• Konkrétní třída v izolaci
• Žádné závislosti
• Odstíněné od prostředí
• Integrační testy
• Interakce několika komponent
Sunday 13 May 2012 18
19. Jednotkové testy
• Nejdůležitější je izolace
• Pokud možno všechny ostatní
třídy odizolované
• Použití Stub a Mock objektů
• Nemíchat testovací scénáře
• Jedna testovací metoda per
scénář
Sunday 13 May 2012 19
JDK se považuje za důveryhodné => nemusíme dělat stuby
20. Unit test
public class ReservationServiceImpl implements ReservationService{
private BookStoreDao bookStoreDao;
private AtomicLong counter = new AtomicLong();
private Map<Long, Reservation> resevations = new HashMap<Long, Reservation>();
public Reservation reserveBook(Long bookId) {
Book book = bookStoreDao.getBook(bookId);
if(book == null) {
throw new BookNotFoundException(bookId);
}
ReservationImpl reservationImpl = new ReservationImpl();
reservationImpl.setReservationId(counter.incrementAndGet());
reservationImpl.setBookId(bookId);
return reservationImpl;
}
}
Sunday 13 May 2012 20
21. Unit test
Externí třída (v testu nahradit stub/mock)
public class ReservationServiceImpl implements ReservationService{
private BookStoreDao bookStoreDao;
private AtomicLong counter = new AtomicLong();
private Map<Long, Reservation> resevations = new HashMap<Long, Reservation>();
public Reservation reserveBook(Long bookId) {
Book book = bookStoreDao.getBook(bookId);
if(book == null) {
throw new BookNotFoundException(bookId);
}
ReservationImpl reservationImpl = new ReservationImpl();
reservationImpl.setReservationId(counter.incrementAndGet());
reservationImpl.setBookId(bookId);
return reservationImpl;
}
}
Sunday 13 May 2012 20
22. Unit test
Externí třída (v testu nahradit stub/mock)
public class ReservationServiceImpl implements ReservationService{
private BookStoreDao bookStoreDao;
private AtomicLong counter = new AtomicLong();
private Map<Long, Reservation> resevations = new HashMap<Long, Reservation>();
public Reservation reserveBook(Long bookId) {
Book book = bookStoreDao.getBook(bookId);
if(book == null) {
throw new BookNotFoundException(bookId);
}
ReservationImpl reservationImpl = new ReservationImpl();
reservationImpl.setReservationId(counter.incrementAndGet());
reservationImpl.setBookId(bookId);
return reservationImpl;
}
}
dvě testovací metody (scénáře)
Sunday 13 May 2012 20
23. Unit test
Externí třída (v testu nahradit stub/mock)
public class ReservationServiceImpl implements ReservationService{
private BookStoreDao bookStoreDao;
private AtomicLong counter = new AtomicLong();
private Map<Long, Reservation> resevations = new HashMap<Long, Reservation>();
public Reservation reserveBook(Long bookId) {
Book book = bookStoreDao.getBook(bookId);
if(book == null) {
throw new BookNotFoundException(bookId);
}
ReservationImpl reservationImpl = new ReservationImpl();
reservationImpl.setReservationId(counter.incrementAndGet());
reservationImpl.setBookId(bookId);
return reservationImpl;
}
}
dvě testovací metody (scénáře)
Sunday 13 May 2012 20
24. Unit test
Externí třída (v testu nahradit stub/mock)
public class ReservationServiceImpl implements ReservationService{
private BookStoreDao bookStoreDao;
private AtomicLong counter = new AtomicLong();
private Map<Long, Reservation> resevations = new HashMap<Long, Reservation>();
public Reservation reserveBook(Long bookId) {
Book book = bookStoreDao.getBook(bookId);
if(book == null) {
throw new BookNotFoundException(bookId);
}
ReservationImpl reservationImpl = new ReservationImpl();
reservationImpl.setReservationId(counter.incrementAndGet());
reservationImpl.setBookId(bookId);
return reservationImpl;
}
}
dvě testovací metody (scénáře)
Sunday 13 May 2012 20
25. Stub
public class BookStoreDaoStub implements BookStoreDao{
private Book book;
Implementuje stejné rozhraní
public Book getBook(Long bookId) {
if(book != null && bookId.equals(book.getId())) {
return book;
}
return null;
jednoduché chování připravené pro test
}
public void saveBook(Book book) {
this.book = book;
}
public Book getBook() {
return book;
} Možnost verifikovat stav stubu
public void setBook(Book book) {
this.book = book;
}
}
Sunday 13 May 2012 21
26. Použití stubu
public class ReservationServiceImplTest {
private BookStoreDao bookStoreDao;
private ReservationServiceImpl reservationServiceImpl = new ReservationServiceImpl();
@Before
public void setup(){
bookStoreDao = new BookStoreDaoStub();
reservationServiceImpl.setBookStoreDao(bookStoreDao);
}
@Test
public void testReserveNonExistingBook() { Příprava stubu
try {
reservationServiceImpl.reserveBook(-1l);
fail("BookNotFoundException musi byt vyhozena pro neexistujici knihu");
} catch(BookNotFoundException e) {
//expected
}
}
}
Sunday 13 May 2012 22
27. Použití stubu
• Výhody
• Znovupoužitelný kód
• Test support modul
• Nevýhody
• Změna interface znamená změnu
stubu
• Implementace všech metod
Sunday 13 May 2012 23
žádné smart defaults
28. Použití mocku
• Mock je automatický generovaná
třía
• Popisujeme chování, které nás
zajímá
• Můžeme zkontrolovat interakci
Sunday 13 May 2012 24
29. Mockovací knihovná Mockito
• Velmi pohodlné mockování
• Fluent API
• Jednoduchá na použití
• Umožňuje verifikovat stav mocku
po testu
Sunday 13 May 2012 25
jsou i další mock knihovny
30. Mock s Mockitem
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class ReservationServiceImplTest {
private BookStoreDao bookStoreDao;
private ReservationServiceImpl reservationServiceImpl = new ReservationServiceImpl();
@Before
public void setup(){
bookStoreDao = mock(BookStoreDao.class);
when(bookStoreDao.getBook(-1l)).thenReturn(null);
reservationServiceImpl.setBookStoreDao(bookStoreDao);
}
@Test
public void testReserveNonExistingBook() {
Příprava mocku
try {
reservationServiceImpl.reserveBook(-1l);
fail("BookNotFoundException musi byt vyhozena pro neexistujici knihu");
} catch(BookNotFoundException e) {
//expected
}
}
Sunday 13 May 2012 26
31. Mock vs. Stub
• Mock
• Smart defaults
• Pokud se jedná o složitější
rozhraní
• Stub
• Znovupoužitelné
Sunday 13 May 2012 27
33. Spring test
• spring-test modul
• Umožňuje nainicializovat Spring
• Umožňuje nainjectovat testované
beany do testu
• Centrální třídy
• SpringJUnit4ClassRunner
• @ContextConfiguration
Sunday 13 May 2012 29
34. import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
Integrace Spring a JUnit
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:META-INF/applicationContext.xml")
public class ReservationServiceImplTest {
@Autowired Konfigurace Springu
private ReservationService reservationService;
Nainjectování testované
@Test
public void testReserveNonExistingBook() { beany
try {
reservationService.reserveBook(-1l);
fail("BookNotFoundException musi byt vyhozena pro neexistujici knihu");
} catch(BookNotFoundException e) {
//expected
}
}
}
Sunday 13 May 2012 30
35. • Napište jednotkový test pro ReservationServiceImp
• použijte mock pro BookStoreDao
• Napište integrační test pro ReservationServiceImp za
pomocí Springu
• Jako BookStoreDao nedefinujte beanu, která bude
naimplementovaná jako stub
Sunday 13 May 2012 31