当前位置: 首页 > 面试题库 >

我可以使用Mockito将对象与自动更新的时间戳进行匹配吗?

史修谨
2023-03-14
问题内容

在进行模拟调用之前自动更新时间戳的这种方法的最佳方法是什么?

这是我要测试的一些伪代码:

public class ThingWithATimestamp {
    public Long timestamp;
    public String name;

    public ThingWithATimestamp(String name) {
        this.name = name;
    }
}

public class TheClassThatDoesStuff {
    private ThingConnector connector;

    public TheClassThatDoesStuff(ThingConnector connector) {
        this.connector = connector;
    }

    public void updateTheThing(MyThingWithATimestamp thing) {
        thing.timestamp = currentTimestamp();
        connector.update(thing);            
    }
}

这是我要测试的内容:

public class TheClassThatDoesStuffTests {
    @Test
    public void canUpdateTheThing() {
        ThingConnector connector = mock(ThingConnector.class);
        TheClassThatDoesStuff doer = new ThisClassThatDoesStuff(connector);

        doer.updateTheThing(new ThingWithATimestamp("the name"));

        verify(connector, times(1)).update(SomeMatcherThatICantFigureOut);
    }

我知道这段代码相当笨拙,但是我认为它准确地描绘了我要验证的内容。我基本上需要一个匹配器来填写测试,以验证时间戳是否在当前时间的X范围内,因此我知道它已正确更新,并且connector.update使用该对象的正确时间戳进行了调用。


问题答案:

我发现处理时间紧迫的代码最可靠的方法是将所有时间紧迫的函数包装在自己的类中。我通常称之为TimeHelper。因此,此类可能如下所示。

import java.util.Date;
public class TimeHelper{
    public long currentTimeMillis(){
        return System.currentTimeMillis();
    }
    public Date makeDate(){
        return new Date();
    }
}

并且可能有更多相同类型的方法。现在,任何使用此类函数的类都应具有(至少)两个构造函数-您将在应用程序中使用的普通构造函数,以及一个以a
TimeHelper参数的私有程序包。这TimeHelper需要存放起来以备后用。

public class ClassThatDoesStuff {
    private ThingConnector connector;
    private TimeHelper timeHelper;

    public ClassThatDoesStuff(ThingConnector connector) {
        this(connector, new TimeHelper());
    }

    ClassThatDoesStuff(ThingConnector connector, TimeHelper timeHelper) {
        this.connector = connector;
        this.timeHelper = timeHelper;
    } 
}

现在,在您的班级中,不要编写System.currentTimeMillis(),而是编写timeHelper.currentTimeMillis()。当然,这将具有完全相同的效果。除了现在,您的课程变得更加可测试了。

测试课程时,请模拟TimeHelper。配置此模拟(使用Mockito的whenthenReturn,或者使用doReturn),以返回您喜欢的任何时间值-
测试所需的任何值。如果要currentTimeMillis()在测试过程中多次调用,则甚至可以在此处返回多个值。

现在,使用第二个构造函数制作要测试的对象,然后传递模拟。这使您可以完美控制测试中将使用什么时间值。并且您可以使您的断言或验证断言恰好使用了正确的值。

public class ClassThatDoesStuffTest{
    @Mock private TimeHelper mockTime;
    @Mock private ThingConnector mockConnector;
    private ClassThatDoesStuff toTest;

    @Test
    public void doesSomething(){
        // Arrange
        initMocks(this);
        when(mockTime.currentTimeMillis()).thenReturn(1000L, 2000L, 5000L);
        toTest = new ClassThatDoesStuff(mockConnector, mockTime);

        // Act
        toTest.doSomething();

        // Assert
        // ... ???
    }
}

如果这样做,您将知道测试将始终有效,并且永远不会依赖于操作系统的时间划分策略。您还可以验证时间戳的确切值,而不必断言它们落在某个近似间隔内。



 类似资料:
  • 问题内容: 如果我在类型表中具有一列并且具有默认值:CURRENT_TIMESTAMP如果我更新同一行中 任何 其他列的值,此列是否会更新为当前时间戳? 似乎没有,但是我不确定这是否应该发生。 我不明白这是什么意思(来自MySQL文档): 如果该列是自动更新的,则当该行中任何其他列的值从其当前值更改时,它将自动更新为当前时间戳。如果所有其他列均设置为其当前值,则该列保持不变。为防止当其他列更改时该

  • 问题内容: 如何从MongoDB集合中的时间(HH:MM:SS.Milisecond)值大于零的日期字段中选择记录,并通过保持日期的时间(HH:MM:SS)值为零来更新记录值是否与Python脚本中的现有值相同? 当前数据如下所示- 如何在Python脚本中仅选择第4、5、6和7行,并使用时间戳将其更新为零? 更新后,数据如下所示- 问题答案: 最好的方式来更新您的文件,并在时间使用日期时间模块,

  • 我们可以使用页面对象执行滚动吗? 实际上,我需要根据元素滚动网页(向上/向下)。如何使用页面对象执行。 我使用Selenium web drive来启动浏览器,并使用Page对象来自动化web页面。 有什么建议吗???

  • 我试图使用Spring的新反应类在RESTfulendpoint上进行一些负载测试。我仍在学习这些课程,所以我可能会走错方向,所以如果你知道一条更简单的道路,请将我重定向到一条更容易的道路上。。。 这是我到目前为止的情况。这是groovy代码: 我可以看到三个请求回来了,所以它正在工作。现在,我想对三个请求中的每一个的请求和响应之间的延迟进行计时。如果我可以获得“i”属性,每个循环都可以通过将当前

  • 问题内容: 我正在构建一个新的Web应用程序,并且正在使用Spring,JPA / Hibernate和Postgres。我的某些表具有creation_ts和lastupdate_ts列,它们是时间戳列,用于跟踪何时发生插入以及何时在行中进行最后更新。 我还在表中的列使用命名约定,因此,根据设计策略,每个表都保证有两列pkey(这是整数代理键)和用于乐观锁定的版本。 我有两种方法可以使这些字段保

  • 问题内容: 我正在查看Amazon S3样本,样本在那里可以插入/删除… 但是我想用新数据更新现有的Blob。基本上,内容是文本文件,并且文本已被修改,我希望S3对象存储新的文本内容。 如何在Java中做到这一点? 问题答案: 在Amazon S3中更新现有对象与首先创建对象没有什么不同,即,使用相同的PUT Object 操作上载对象,并将覆盖现有对象(如果不受其他方式的保护,例如通过使用存储桶