我有以下场景。我想将设置创建日期的责任委托(delegate)给 DAO 对象。
Class Product{
//other fields
Date creationDate;
}
Class ProductDAO{
private GenericDAO dao;
public void create(Product p){
p.setCreationDate(new Date());
dao.create(p);
}
}
Class Main{
private ProductDAO productDAO;
public void createProduct(){
Product p = new Product();
productDAO.create(p);
LOG.debug(p.getCreationDate());
}
}
- 现在的问题是,当我测试主类的 createProduct 方法时 模拟productDAO,如何定义模拟对象的行为 'productDAO',以便它设置创建日期和日志语句 不抛出 NullPointerException?
上述方法看起来正确吗?我应该退回更新的产品吗 来自 ProductDAO 类的 create 方法的对象而不是依赖 副作用?
Product create(Product p){ p.setCreationDate(new Date()); dao.create(p); return p; }
或者在主类中,我应该在之后从数据库中读取对象吗? 创建而不是依赖返回对象或副作用 创建产品方法?在这种情况下,唯一的问题是它会增加额外调用的开销。
public void createProduct(){ Product p = new Product(); productDAO.create(p); p = productDAO.read(p.getId()); LOG.debug(p.getCreationDate()); }
抱歉,问题太长了。我希望我能够解释一下。
最佳答案
测试日期是否已设置的一种方法是使用 argThat 。你需要做类似的事情
@Test
public void shouldSetCreationDateAtProductWhenCreatingIt() {
// given
Product product = mock(Product.class);
// when
dao.create(product);
// then
verify(product).setCreationDate(argThat(is(not(nullValue(Date.class)))));
}
因此,我只做了一个简单的验证,即使用非 null 值 Date
调用了 Product#setCreationDate(Date)
。您可以创建自定义匹配器来查看 Date
对象是否是您期望的对象。这只是为了测试 ProductDao
类。
如果您想以需要模拟 getCreationDate 返回的方式对 Main
进行单元测试,您可以向 ProductDao#create
添加返回,使其成为返回持久化的对象。
public class ProductDao {
public Product create(Product p){
p.setCreationDate(new Date());
dao.create(p);
return p;
}
}
然后你可以在你的主类中模拟productDao的返回
@Test
public void shouldUseReturnedProductFromDaoToLog() {
// given
Product product = mock(Product.class);
Date creationDate = new Date();
given(product.getCreationDate()).willReturn(creationDate);
given(dao.create(any(Product.class)).willReturn(product);
// when
Product createdProduct = main.createProduct();
// then
assertThat(createdProduct, is(equalTo(product)));
}
我添加了对 createProduct 的返回,因为我想测试它是否与从 DAO 返回的相同。然后,我们将单元测试与 Main
(创建 Product 并将其保存在 Dao 中)分开,看看 ProductDao
是否执行了预期的操作(设置creationDate)
希望这有帮助。
关于java - 从 DAO 中的 create 方法返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15012599/