Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 具有新日期的Junit()_Date_Junit_Easymock - Fatal编程技术网

Date 具有新日期的Junit()

Date 具有新日期的Junit(),date,junit,easymock,Date,Junit,Easymock,当我使用以下方法时,junit测试是什么: @Override public void saveLastSuccesfullLogin(final User user) { gebruiker.setLastLogin(new Date()); storeUser(user); } 子方法存储用户: @Override public void storeUser(final User user) { EntityManager em = emf.createEntity

当我使用以下方法时,junit测试是什么:

@Override
public void saveLastSuccesfullLogin(final User user) {
    gebruiker.setLastLogin(new Date());
    storeUser(user);
}
子方法存储用户:

@Override
public void storeUser(final User user) {
    EntityManager em = emf.createEntityManager();

    em.getTransaction().begin();
    em.merge(user);
    em.getTransaction().commit();

    em.close();
}

我遇到的问题是日期,它被设置为实体用户,然后被存储。我正在使用junit和easymock。

日期有什么问题?你不知道以后要断言什么?有几个备选方案:

  • 将日期传递到方法中
  • 创建一个工厂以获取当前日期/时间,这样您就可以模拟它了
  • 在正确性阈值内断言日期
  • 尝试将新日期()拉入具有默认访问说明符的方法,如下所示

    @Override
    public void saveLastSuccesfullLogin(final User user) {
        gebruiker.setLastLogin(getDate());
        storeUser(user);
    }
    Date getDate() {
        return new Date();
    }
    
    在测试类中,使用模拟日期或存根日期覆盖类,如下所示

    <ClassUnderTest> classUnderTest = new <ClassUnderTest> () {
      @Override 
      Date getDate() {
        return mockDate;
      } 
    }
    
    classUnderTest=new(){
    @凌驾
    日期getDate(){
    返回日期;
    } 
    }
    
    通过这种方式,您可以很容易地断言日期值,因为它将被删除。

    在依赖项注入可用的地方(如EJB、Spring等),也可以使用更“企业化”的方法

    您可以定义一个接口,例如TimeService和返回当前日期的Adde方法

      public interface TimeService {
        Date getCurrentDate();
      }
    
    您可以实现此操作以返回
    新日期()
    ,并按如下方式使用它:

      gebruiker.setLastLogin(timeService.getCurrentTime());
    
    这显然很容易测试,因为您可以模拟
    TimeService
    。使用EasyMock(只是一个示例),这可能是:

      Date relevantDateForTest = ...
      expect(timeService.getCurrentTime()).andReturn(relevantDateForTest);
      replay(timeService);
    

    在整个代码中使用
    TimeService
    ,并且从不使用
    new Date()
    是一种非常好的做法,它还有其他优点。我发现它在很多场合都很有用,包括对将来会激活的功能进行手动功能测试。更进一步,可以从外部系统检索系统时间,从而使其在集群等之间保持一致。

    您还可以创建getDate方法和日期静态变量:

        private static Date thisDate = null;
    
        @Override
        public void saveLastSuccesfullLogin(final User user) {
            gebruiker.setLastLogin(getDate());
            storeUser(user);
        }
    
        public Date getDate() {
            if(thisDate != null) return thisDate;
            return new Date();
        }
    
        public void setDate(Date newDate) {
            thisDate = newDate;
        }
    

    然后在您的测试方法中,您可以继续调用setDate来控制您将获得的日期。

    我为那些希望了解更多有关使用单独服务检索当前日期的信息的人编写了更详细的说明。我将使用匿名类来代替重写。所以它将是ClassUnderTest t=spy(newClassUnderTest());when(t.getDate())。然后return(DATE\u MOCK);