如何使用APPFUSE 2来开发

 
Create POJO and Gen DB table
Refer to http://blog.csdn.net/totogogo/archive/2008/03/04/2146996.aspx
 
1.      Create a POJO class Person (in the src/main/java/**/model 目录下)
 
package com.mycompany.model;
import org.appfuse.model.BaseObject;
import javax.persistence.*;
 
@Entity
public class Person extends BaseObject {
    private Long id;
    private String firstName;
    private String lastName;
 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {  
        return id;
    }
 
    @Column(name="first_name", length=50)   
    public String getFirstName() {
        return firstName;
    }
 
    @Column(name="last_name", length=50)
    public String getLastName() {
        return lastName;
}
。。。。。。
}
 
POJO扩展BaseObject是可选的,但建议扩展它,因为它会强制你必须在POJO里写toString(), equals() and hashCode() 方法。
如果你计划把POJO放进user's session里,或在web service里使用它,那么POJO还应该实现java.io.Serializable接口
 
 
2.      添加下列代码到 src/main/resources/hibernate.cfg.xml 文件
<mapping class="com.mycompany.model.Person"/>
       保存之后,执行命令: mvn test-compile hibernate3:hbm2ddl(前提是database要打开),将会在database里看到添加了Person Table
 
Create Hibernate DAO
Refer to http://blog.csdn.net/totogogo/archive/2008/03/04/2147028.aspx
 
1.      创建 DAO 的单元测试 PersonDaoTest(in your src/test/java/**/dao directory)
package com.mycompany.dao;
 
import org.appfuse.dao.BaseDaoTestCase;
import org.springframework.dao.DataAccessException;
import com.mycompany.model.Person;
import java.util.List;
 
public class PersonDaoTest extends BaseDaoTestCase {
    private PersonDao personDao = null;
    public void setPersonDao(PersonDao personDao) {
        this.personDao = personDao;
    }
 
    public void testFindPersonByLastName() throws Exception {
        List<Person> people = personDao.findByLastName("Raible");
        assertTrue(people.size() > 0);
    }
 
    public void testAddAndRemovePerson() throws Exception {
        Person person = new Person();
        person.setFirstName("Country");
         person.setLastName("Bry");
        person = personDao.save(person);
        flush();
 
        person = personDao.get(person.getId());
        assertEquals("Country", person.getFirstName());
        assertNotNull(person.getId());
        log.debug("removing person...");
        personDao.remove(person.getId());
        flush();
             
              // 测试在 get removed person 时抛出 exception
         try {
            personDao.get(person.getId());
            fail("Person found in database");
        } catch (DataAccessException dae) {
            log.debug("Expected exception: " + dae.getMessage());
            assertNotNull(dae);
        }
    }
}
 
2.      DbUnit Maven Plugin 可以用来在测试运行前将数据插入数据库中 , 你只需将需加入的表或记录的信息放到文件 src/test/resources/sample-data.xml ,如:
    <table name='person'>
     <column>id</column>
     <column>first_name</column>
     <column>last_name</column>
     <row>
        <value>1</value>
        <value>Matt</value>
        <value>Raible</value>
     </row>
    </table>
 
3.      Step 1创建的 PersonDaoTest.java是无法编译的,因为还没有创建PersonDao ( 但要养成好习惯,先写单元测试!PersonDao接口及其实现类(in your src/main/java/**/dao directory))。因此我们 创建
 
PersonDao.java:
package com.mycompany.dao;
import com.mycompany.model.Person;
import java.util.List;
import org.appfuse.dao.GenericDao;
 
// 注:扩展 GenericDao 则包含了它的 CRUD 方法!!
public interface PersonDao extends GenericDao<Person, Long> {
    public List<Person> findByLastName(String lastName);
}
 
PersonDaoHibernate.java:
package com.mycompany.dao.hibernate;
 
import com.mycompany.model.Person;
import com.mycompany.dao.PersonDao;
import org.appfuse.dao.hibernate.GenericDaoHibernate;
import java.util.List;
 
public class PersonDaoHibernate extends GenericDaoHibernate<Person, Long> implements PersonDao {
    public PersonDaoHibernate() {
        super(Person.class);
    }
    public List<Person> findByLastName(String lastName) {
        return getHibernateTemplate().find("from Person where lastName=?", lastName);
    }
}
 
4.      src/ main / webapp / WEB-INF/applicationContext .xml 添加下列代码来定义 personDao bean
    <bean id="personDao" class="com.mycompany.dao.hibernate.PersonDaoHibernate">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean> 
 
5.      执行命令 mvn test -Dtest=PersonDaoTest 来进行单元测试
   注:执行命令 mvn test是运行所有单元测试
 
 
Create Service
Refer to http://appfuse.org/display/APF/Services 
 
在创建了DAO之后,下面的步骤是Manager Service class,它的作用是作为persistence (DAO) layer and the web layer 之间的桥梁,使presentation layer和database layer松耦合(例如i.e. for Swing apps and web services)。
 
Managers 就是用来放你的 business logic 的地方!
 
1.  创建 PersonManager interface in your src/main/java/**/service directory
package com.mycompany.service;
 
import com.mycompany.model.Person;
import java.util.List;
import org.appfuse.service.GenericManager;
 
public interface PersonManager extends GenericManager<Person, Long> {
    public List<Person> findByLastName(String lastName);
}
 
为什么要扩展 GenericManager??
这是因为 GenericManager 包含了 CRUD 的一些方法,你也可以不扩展它,自己写!
 
2.  Create manager 单元测试 PersonManagerImplTest
注意:该单元测试使用了 mock objects ,这是为了使你的 tests 不依赖 external dependencies ,也就是说你不需要创建一个 database 也可以 run these tests。这样做就使得在一个大的项目里,DAO和manager分工给不同的人来开发,那么开发manager的人甚至可以在dao impletement完成之前就可以写好manager的单元测试。
 
本例中使用的 mock objects jMock另外一个使用比较广泛的mock object libraryEasyMock
 
PersonManagerImplTest.java
package com.mycompany.service.impl;
。。。。
public class PersonManagerImplTest extends BaseManagerMockTestCase {
    private PersonManagerImpl manager = null;
    private Mock dao = null;
    private Person person = null;
 
    protected void setUp() throws Exception {
        dao = new Mock(PersonDao.class);
        manager = new PersonManagerImpl((PersonDao) dao.proxy());
    }
    protected void tearDown() throws Exception {
        manager = null;
}
 
    public void testGetPerson() {
        log.debug("testing getPerson");
 
        Long id = 7L;
        person = new Person();
 
        // set expected behavior on dao
              //!! 关键方法
        dao.expects(once()).method("get")
                .with(eq(id))
                .will(returnValue(person));
 
        Person result = manager.get(id);
        assertSame(person, result);
    }
 
    public void testGetPersons() {
        log.debug("testing getPersons");
 
        List people = new ArrayList();
 
        // set expected behavior on dao
        dao.expects(once()).method("getAll")
                .will(returnValue(people));
 
        List result = manager.getAll();
        assertSame(people, result);
    }
 
    public void testFindByLastName() {
        log.debug("testing findByLastName");
 
        List people = new ArrayList();
        String lastName = "Smith";
 
        // set expected behavior on dao
        dao.expects(once()).method("findByLastName")
                .with(eq(lastName))
                .will(returnValue(people));
 
        List result = manager.findByLastName(lastName);
        assertSame(people, result);
    }
 
    public void testSavePerson() {
        log.debug("testing savePerson");
 
        person = new Person();
 
        // set expected behavior on dao
        dao.expects(once()).method("save")
                .with(same(person))
                .will(returnValue(person));
 
        manager.save(person);
    }
 
    public void testRemovePerson() {
        log.debug("testing removePerson");
 
        Long id = 11L;
        person = new Person();
 
        // set expected behavior on dao
        dao.expects(once()).method("remove")
                .with(eq(id))
                .isVoid();
 
        manager.remove(id);
    }
}
 
3. Create Manager implement class PersonManagerImpl
package com.mycompany.service.impl;
。。。。
public class PersonManagerImpl extends GenericManagerImpl<Person, Long> implements PersonManager {
    PersonDao personDao;
 
    public PersonManagerImpl(PersonDao personDao) {
        super(personDao);
        this.personDao = personDao;
    }
 
    public List<Person> findByLastName(String lastName) {
        return personDao.findByLastName(lastName);
    }
}
 
4. src/ main / webapp / WEB-INF/applicationContext .xml 添加下列代码来定义 personDao bean
<bean id="personManager" class="com.mycompany.service.impl.PersonManagerImpl">
    <constructor-arg ref="personDao"/>
</bean>
 
5.  执行命令 mvn test -Dtest=PersonManagerImplTest 来进行单元测试
       注:执行命令 mvn test是运行所有单元测试
 
 
 

你可能感兴趣的:(DAO,exception,manager,单元测试,import,Appfuse)