At line 182 changed 1 line. |
Para começar, crie uma classe PessoaDaoTest.java no diretório test/dao/**/dao. Esta classe deve estender [BaseDaoTestCase|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDAOTestCase.java.html], que já existe neste pacote. Esta classe pai é usada para carregar ApplicationContext do [Spring's|http://www.springframework.org] (Spring une todas as camadas), e para automaticamente carregar um arquivo .properties (ResourceBundle) que tem o mesmo nome que sua classe *Test.class. Neste exemplo, se você colocar um arquivo PessoaDAOTest.properties no mesmo diretório que PessoaDAOTest.java, este arquivo de propriedades estará disponível via uma variável rb. |
Para começar, crie uma classe PessoaDaoTest.java no diretório test/dao/**/dao. Esta classe deve estender [BaseDaoTestCase|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDAOTestCase.java.html], sub-classe da classe [AbstractDependencyInjectionSpringContextTests|http://www.springframework.org/docs/api/org/springframework/test/AbstractDependencyInjectionSpringContextTests.html] do Spring que já existe neste pacote. Esta classe pai é usada para carregar ApplicationContext do [Spring's|http://www.springframework.org] (Spring une todas as camadas), e para (opcionalmente) carregar um arquivo .properties (ResourceBundle) que tem o mesmo nome que sua classe *Test.class. Neste exemplo, se você colocar um arquivo PessoaDAOTest.properties no mesmo diretório que PessoaDAOTest.java, este arquivo de propriedades estará disponível via uma variável rb. |
At line 190 removed 2 lines. |
import org.apache.commons.logging.Log; |
import org.apache.commons.logging.LogFactory; |
At line 191 added 1 line. |
import org.springframework.dao.DataAccessException; |
At line 194 removed 1 line. |
|
At line 197 removed 3 lines. |
|
//~ Instance fields ======================================================== |
|
At line 203 changed 4 lines. |
//~ Methods ================================================================ |
protected void setUp() { |
log = LogFactory.getLog(PersonDaoTest.class); |
dao = (PersonDao) ctx.getBean("personDao"); |
public void setPersonDao(PersonDao dao) { |
this.dao = dao; |
At line 208 removed 8 lines. |
|
protected void tearDown() { |
dao = null; |
} |
|
public static void main(String[] args) { |
junit.textui.TestRunner.run(PersonDaoTest.class); |
} |
At line 219 changed 1 line. |
O código que você vê acima é o que precisamos para um teste JUnit básico, que inicializa e destrói nosso PessoaDAO. O objeto ctx é uma referência ao ApplicationContext do Spring, o qual é inicializado em um bloco estático da classe [BaseDaoTestCase's|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDaoTestCase.java.html] class. |
O código que você vê acima é o que precisamos para um teste de integração Spring básico que inicializa e destrói nosso PessoaDAO. Spring irá usar autowiring (auto-ligamento) por tipo para chamar o método ''setPersonDao()'' e atribuir o bean "personDao" como uma dependência desta classe. |
At line 225 added 1 line. |
|
At line 248 changed 1 line. |
assertTrue(person.getLastName().equals("Last Name Updated")); |
assertEquals(person.getLastName(), "Last Name Updated"); |
At line 249 added 1 line. |
|
At line 266 changed 1 line. |
assertNull(dao.getPerson(person.getId())); |
|
try { |
person = dao.getPerson(person.getId()); |
fail("Person found in database"); |
} catch (DataAccessException dae) { |
log.debug("Expected exception: " + dae.getMessage()); |
assertNotNull(dae); |
} |
At line 307 changed 1 line. |
Primeiro, crie a interface PessoaDAO.java no diretório src/dao/**/dao e especifique os métodos CRUD básicos para qualquer classe de implementação. Eliminei as partes JavaDocs na classe abaixo apenas por propósito de visualização.'' |
Primeiro, crie a interface PessoaDAO.java no diretório src/dao/**/dao e especifique os métodos CRUD básicos para qualquer classe de implementação. Eliminei as partes JavaDocs na classe abaixo apenas por propósito de visualização. |
At line 315 removed 2 lines. |
import java.util.List; |
|
At line 318 removed 3 lines. |
|
public List getPeople(Person person); |
|
At line 322 changed 3 lines. |
|
public void savePerson(Object person); |
|
public void savePerson(Person person); |
At line 339 removed 3 lines. |
import org.apache.commons.logging.Log; |
import org.apache.commons.logging.LogFactory; |
|
At line 328 added 1 line. |
import org.springframework.orm.ObjectRetrievalFailureException; |
At line 345 removed 3 lines. |
import java.util.List; |
|
|
At line 350 changed 1 line. |
private Log log = LogFactory.getLog(PersonDaoHibernate.class); |
public Person getPerson(Long id) { |
Person person = (Person) getHibernateTemplate().get(Person.class, id); |
At line 352 changed 3 lines. |
public List getPeople(Person person) { |
return getHibernateTemplate().find("from Person"); |
} |
if (person == null) { |
throw new ObjectRetrievalFailureException(Person.class, id); |
} |
At line 356 changed 2 lines. |
public Person getPerson(Long id) { |
return (Person) getHibernateTemplate().get(Person.class, id); |
return person; |
At line 360 changed 1 line. |
public void savePerson(Object person) { |
public void savePerson(Person person) { |
At line 365 changed 2 lines. |
Object person = getHibernateTemplate().load(Person.class, id); |
getHibernateTemplate().delete(person); |
// object must be loaded before it can be deleted |
getHibernateTemplate().delete(getPerson(id)); |
At line 371 removed 21 lines. |
|
Você notará aqui que não estamos fazendo nada com o parâmetro pessoa. Isto é somente um place holder por enquanto no futuro você pode filtrar suas propriedades usando [Hibernate's Query Language|http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html] (HQL) ou usando [Criteria Queries|http://www.hibernate.org/hib_docs/reference/en/html/querycriteria.html]. |
|
''Um exemplo usando Criteria Query:'' |
|
[{Java2HtmlPlugin |
|
Example example = Example.create(person) |
.excludeZeroes() //exclude zero valued properties |
.ignoreCase(); //perform case insensitive string comparisons |
try { |
return getSession().createCriteria(Person.class) |
.add(example) |
.list(); |
} catch (Exception e) { |
throw new DAOException(e); |
} |
return new ArrayList(); |
|
}] |
|
At line 405 removed 2 lines. |
<value>org/appfuse/model/UserCookie.hbm.xml</value> |
<value>org/appfuse/model/UserRole.hbm.xml</value> |
At line 435 changed 1 line. |
''Next Up:'' __Part II:__ [Creating new Managers|CreateManager] - A HowTo for creating [Business Delegates|http://java.sun.com/blueprints/corej2eepatterns/Patterns/BusinessDelegate.html] that talk to the database tier (DAOs) and the web tier (Struts Actions). |
''Próxima:'' __Parte II:__ [Criando novos Managers|CreateManager_pt] - Um "HowTo" para criar [Business Delegates|http://java.sun.com/blueprints/corej2eepatterns/Patterns/BusinessDelegate.html] que comunicam-se com a camada de banco de dados (DAOs) e web (Spring Controllers). |