7

当我有以下方法时,junit 测试会是什么:

@Override
public void saveLastSuccesfullLogin(final User user) {
    gebruiker.setLastLogin(new Date());
    storeUser(user);
}

子方法 storeUser:

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

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

    em.close();
}

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

4

4 回答 4

4

尝试将 new Date() 拉入具有默认访问说明符的方法中,如下所示

@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;
  } 
}

通过这种方式,您可以轻松地断言日期值,因为它将被剔除。

于 2011-02-25T08:25:26.530 回答
3

日期有什么问题?你不知道以后要断言是什么?几种选择:

  1. 将日期传递给方法
  2. 创建一个工厂以获取当前日期/时间,以便您可以模拟它
  3. 断言正确性阈值内的日期
于 2011-02-24T02:37:34.690 回答
0

还有一种更“企业级”的方法可以用于依赖注入可用的地方(如 EJB、Spring 等)。

您可以定义一个接口,例如 TimeService 并添加返回当前日期的 e 方法。

  public interface TimeService {
    Date getCurrentDate();
  }

您可以实现它以返回new Date()并像这样使用它:

  gebruiker.setLastLogin(timeService.getCurrentTime());

这显然很容易测试,因为您可以模拟TimeService. 使用 EasyMock(只是一个例子),这可能是:

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

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

于 2011-08-05T09:22:52.357 回答
0

您还可以创建一个 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 来控制您将获得的日期。

于 2014-10-03T16:28:26.733 回答