当前位置: 首页 > 知识库问答 >
问题:

如何测试使用LocalDateTime创建的日期。现在()

谢叶五
2023-03-14

我有这门课

class MyObject {
    private LocalDateTime date;

    public LocalDateTime getDate() { return this.date; }

    public void myMethod() {
        this.date = LocalDateTime.now();
    }
}

如何测试日期设置是否正确?我无法模拟now(),因为它是静态的,如果我在测试中使用LocalDateTime,两个日期将不相同。

共有3个答案

松铭
2023-03-14

更新你的课程如下:

class MyObject {
    private LocalDateTime date;

    public Supplier<LocalDateTime> localDateTime = ()-> LocalDateTime.now();

    public LocalDateTime getDate() { return this.date; }

    public void myMethod() {
        this.date = localDateTime.get();
    }
}

测试方法中,在调用myMethod之前更新供应商变量,如下所示:

objMyObject.localDateTime = ()-> LocalDateTime.parse("2020-11-24T23:59:59.999");
芮立果
2023-03-14

您可以在调用myMethod()之前生成一个日期时间,并确保此日期早于或等于getDate()返回的日期,类似于:

@Test
public void testDate() {
    MyObject object = new MyObject();
    // Get the current date time 
    LocalDateTime time = LocalDateTime.now();
    // Affect the current date time to the field date
    object.myMethod();
    // Make sure that it is before or equals
    Assert.assertTrue(time.isBefore(object.getDate()) || time.isEqual(object.getDate()));
}

如果你不介意给你的类添加耦合,一个更好的方法是提供一个供应商

public class MyObject {
    private final Supplier<LocalDateTime> supplier;
    private LocalDateTime date;

    public MyObject() {
        this(LocalDateTime::now);
    }

    public MyObject(final Supplier<LocalDateTime> supplier) {
        this.supplier = supplier;
    }

    public LocalDateTime getDate() { return this.date; }

    public void myMethod() {
        this.date = supplier.get();
    }
}

这样就可以很容易地在您的测试用例中创建用于测试目的的供应商

例如,测试用例可以是:

@Test
public void testDate() {
    LocalDateTime time = LocalDateTime.now();
    MyObject object = new MyObject(() -> time);
    object.myMethod();
    Assert.assertTrue(time.isEqual(object.getDate()));
}

裴华荣
2023-03-14

我现在不能嘲笑,因为它是静态的

确实如此——但幸运的是,您不必这样做。相反,将“日期/时间提供者”视为依赖项,并将其作为正常注入。java.time提供了这样一个依赖项:java.time.时钟。在测试中,您可以通过Clock.fixed(...)(不需要模拟)提供固定时钟,对于生产,您可以使用Clock.system(...)

然后将代码更改为:

class MyObject {
    private final Clock clock;
    private LocalDateTime date;

    public MyObject(Clock clock) {
        this.clock = clock;
    }

    public LocalDateTime getDate() {
        return this.date;
    }

    public void myMethod() {
        this.date = LocalDateTime.now(clock);
    }
}

...或者您通常处理依赖项的方式。

 类似资料:
  • Java 8 添加了一个新的 java.time API 来处理日期和时间 (JSR 310)。 我有字符串形式的日期和时间(例如< code >“2014-04-08 12:30”)。如何从给定的字符串中获取< code>LocalDateTime实例? 在我完成对象的工作后:如何将实例转换回与上述格式相同的字符串?

  • 我正在尝试将存储在mongoDb中的Javascript日期转换为Java LocalDateTime ISO\u Date\u TIME,并且我一直遇到ParseException,我不知道为什么我的代码会出错。首先,代码: 解析器: 传递的日期格式为“2021 10月7日星期四21:29:36 GMT 0000(协调世界时)” 我收到的错误是: getUserById()中的异常,原因='ja

  • 问题内容: Java 8添加了新的java.time API,用于处理日期和时间(JSR 310)。 我将日期和时间作为字符串(例如)。如何从给定的字符串中获取实例? 处理完对象后:如何将实例转换回具有上述格式的字符串? 问题答案: 解析日期和时间 要从字符串创建对象,可以使用方法。它使用字符串和作为参数。所述用于指定的日期/时间模式。 格式化日期和时间 要创建对象的格式化字符串,可以使用方法。

  • Mocito不处理静态方法实例,我用它来映射user到UserDto。我有错误:error:org.mockito.exceptions.misusing.missingMethodInvocationException:when()需要一个参数,该参数必须是“mock上的方法调用”。例如:when(mock.getArticles()).thenreturn(articles); 此外,此错误可

  • 问题内容: tl; dr:我想在Redshift中生成一个日期表,以使报表更易于生成。最好不需要在Redshift中已经有大表,而需要上传一个csv文件。 长版:我正在处理一份报告,其中我必须平均一周中每天创建的新项目。日期范围可能跨越数月或更长时间,因此可能有5个星期一,但只有4个星期日,这可能会使数学有些棘手。另外,我不能保证每天都有一个实例,尤其是一旦用户开始切片数据时。其中,这是BI工具的

  • 本文向大家介绍如何从Swift Xcode中的日期创建日期对象?,包括了如何从Swift Xcode中的日期创建日期对象?的使用技巧和注意事项,需要的朋友参考一下 来自Objective C- Background,现在我们不需要使用NSDate,因为Swift已定义了自己的结构类型Date。日期桥接到NSDate类。您可以在与Objective-C API交互的代码中互换使用这些代码。 要了解有