[b][color=red]回头看了看。。本篇纯属误导人之作。 :oops: [/color][/b]
我正在学TDD,这算是自己做的一个小玩具吧,练手用而已。
我打算做一个Blog,一个Blog的主要功能也就是:保存Blog、删除Blog、查看Blog。OK,先上TODOLIST:
[quote][b]保存BLOG[/b]
删除BLOG
查看BLOG具体内容[/quote]
然后是测试代码,测试保存BLOG:
我需要一个Blog,一般Blog都会有标题、内容、创建时间:
BlogService里的业务逻辑很简单,就是调用DAO保存Blog。有人说调用DAO保存Blog算什么业务逻辑,那只是对Blog的持久化。可是我觉得,在博客这个“领域”,保存一篇博客算是一个业务逻辑吧?只是这个业务逻辑非常简单,我只要测试这个动作有没被执行就可以了。
在gigix的[url="http://www.iteye.com/topic/20063"]什么是“测试驱动开发”[/url]中见robbin说replay()前面是详细设计,后面是需求文档,当时没太理解,现在看看代码好像真是这么回事。
现在的测试代码编译不了,需要实现一个Blog:
一个BlogDAO接口,声明一个save(Blog blog)方法:
一个BlogService接口,声明一个save(Blog blog)方法、一个setBlogDAO(BlogDAO blogDAO)方法:
最后导入Spring包,现在测试代码编译通过,但是测试通不过,红条。抛的异常是NullPointerException,找了一会原因,发现还没配置BlogService的实现类,于是写了个BlogService的实现类如下,并在spring配置文件中配上:
由于业务逻辑非常简单(调用dao持久化blog),所以我就不先运行Test,等看见红条后再来修改Service的实现。大步一点,我直接把方法给写完整了:
最后我觉得应该可以了,运行测试,绿条,通过了,一个功能就完成了。代码很简单,也没什么要重构的。现在划掉TODOLIST上的“保存BLOG”,接下来是“删除BLOG”。
TODOLIST:
[quote][color=gray]保存BLOG[/color]
[b]删除BLOG[/b]
查看BLOG具体内容[/quote]
先到这吧,整个过程都是我在自以为是,呵呵。
我想请教论坛里的前辈,这整个过程有没什么问题?
还有单元测试中,Spring是不是这么用的(applicationContext.getBean(beanName))?
希望多多批评,谢谢了!
我正在学TDD,这算是自己做的一个小玩具吧,练手用而已。
我打算做一个Blog,一个Blog的主要功能也就是:保存Blog、删除Blog、查看Blog。OK,先上TODOLIST:
[quote][b]保存BLOG[/b]
删除BLOG
查看BLOG具体内容[/quote]
然后是测试代码,测试保存BLOG:
/**
* 测试保存BLOG
*/
@Test
public void testSaveBlog(){
blogService.save(blog);
}
我需要一个Blog,一般Blog都会有标题、内容、创建时间:
/**
* 测试保存BLOG
*/
@Test
public void testSaveBlog(){
Blog blog = new Blog();
blog.setTitle("title");
blog.setContent("content");
blog.setCreatedTime(new Date());
blogService.save(blog);
}
BlogService里的业务逻辑很简单,就是调用DAO保存Blog。有人说调用DAO保存Blog算什么业务逻辑,那只是对Blog的持久化。可是我觉得,在博客这个“领域”,保存一篇博客算是一个业务逻辑吧?只是这个业务逻辑非常简单,我只要测试这个动作有没被执行就可以了。
public class BlogServiceTest extends BaseTest {
private BlogService blogService;
private BlogDAO blogDAO;
public void setBlogService(BlogService blogService){
this.blogService = blogService;
}
@Before
public void setUp(){
this.blogService = (BlogService)this.applicationContext.getBean("blogService");
blogDAO = createMock(BlogDAO.class);
this.blogService.setBlogDAO(blogDAO);
}
@After
public void tearDown(){
verify(blogDAO);
}
/**
* 测试保存BLOG
*/
@Test
public void testSaveBlog(){
Blog blog = new Blog();
blog.setTitle("title");
blog.setContent("content");
blog.setCreatedTime(new Date());
blogDAO.save(blog);
replay(blogDAO);
blogService.save(blog);
}
}
在gigix的[url="http://www.iteye.com/topic/20063"]什么是“测试驱动开发”[/url]中见robbin说replay()前面是详细设计,后面是需求文档,当时没太理解,现在看看代码好像真是这么回事。
现在的测试代码编译不了,需要实现一个Blog:
public class Blog {
private String id;
private String title;
private String content;
private Date createdTime;
//Setter
}
一个BlogDAO接口,声明一个save(Blog blog)方法:
public interface BlogDAO {
/**
* 保存Blog
* @param blog 要保存的Blog
*/
void save(Blog blog);
}
一个BlogService接口,声明一个save(Blog blog)方法、一个setBlogDAO(BlogDAO blogDAO)方法:
public interface BlogService {
/**
* Set DAO
* @param blogDAO
*/
void setBlogDAO(BlogDAO blogDAO);
/**
* 保存Blog
* @param blog 要保存的Blog
*/
void save(Blog blog);
}
最后导入Spring包,现在测试代码编译通过,但是测试通不过,红条。抛的异常是NullPointerException,找了一会原因,发现还没配置BlogService的实现类,于是写了个BlogService的实现类如下,并在spring配置文件中配上:
public class BlogServiceImpl implements BlogService {
@Override
public void save(Blog blog) {
// TODO Auto-generated method stub
}
@Override
public void setBlogDAO(BlogDAO blogDAO) {
// TODO Auto-generated method stub
}
}
由于业务逻辑非常简单(调用dao持久化blog),所以我就不先运行Test,等看见红条后再来修改Service的实现。大步一点,我直接把方法给写完整了:
public class BlogServiceImpl implements BlogService {
private BlogDAO blogDAO;
@Override
public void save(Blog blog) {
blogDAO.save(blog);
}
@Override
public void setBlogDAO(BlogDAO blogDAO) {
this.blogDAO = blogDAO;
}
}
最后我觉得应该可以了,运行测试,绿条,通过了,一个功能就完成了。代码很简单,也没什么要重构的。现在划掉TODOLIST上的“保存BLOG”,接下来是“删除BLOG”。
TODOLIST:
[quote][color=gray]保存BLOG[/color]
[b]删除BLOG[/b]
查看BLOG具体内容[/quote]
先到这吧,整个过程都是我在自以为是,呵呵。
我想请教论坛里的前辈,这整个过程有没什么问题?
还有单元测试中,Spring是不是这么用的(applicationContext.getBean(beanName))?
希望多多批评,谢谢了!