java - 从 DAO 中的 create 方法返回对象

标签 java

我有以下场景。我想将设置创建日期的责任委托(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());
      } 
    }
  1. 现在的问题是,当我测试主类的 createProduct 方法时 模拟productDAO,如何定义模拟对象的行为 'productDAO',以便它设置创建日期和日志语句 不抛出 NullPointerException?
  2. 上述方法看起来正确吗?我应该退回更新的产品吗 来自 ProductDAO 类的 create 方法的对象而不是依赖 副作用?

     Product create(Product p){
           p.setCreationDate(new Date());
           dao.create(p);
           return p;
      }
    
  3. 或者在主类中,我应该在之后从数据库中读取对象吗? 创建而不是依赖返回对象或副作用 创建产品方法?在这种情况下,唯一的问题是它会增加额外调用的开销。

     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/

相关文章:

java - 使用 Java 登录,其中服务器身份验证可以如此或 Web 应用程序容器基本

java - 创建文件/文件夹

java - lib 项目在哪里用于 google play 服务?

java - java android取消静音按钮的问题

java - 线程中出现异常 "AWT-EventQueue-0"java.awt.HeadlessException

java - 与 MySql 的连接正在自动中止。如何正确配置Connector/J?

java - 可以在使用 Asynctask 将文件上传到服务器时显示估计时间、kbs、mb

java - 为什么 Byte 不能保存在其范围内的值?

java - xml转json再转回xml返回错误

java - 如何让 SAX 解析器从 xml 声明中确定编码?