2015-02-10 121 views
2

我正在嘗試編寫一個Junit來測試具有當前時間戳的對象。問題是當我第一次創建當前時間戳記如下:在junit中測試當前java時間戳

Date date = new Date(); 
Timestamp timestamp = new Timestamp(date.getTime()); 

它創建一個時間戳記對象與當前時間包括毫秒。所以,當我跑我的測試中,他們永遠都不會相同的,因爲有一段時間,我創建的時間戳對象和測試的時間之間的時間以毫秒爲單位經過:

x.setTimeToMyMethod(timestamp); 
assertEquals(timestamp, x.getTimeFromMyMethod()); 

我試圖用SimpleDateFormat的,但它轉換的時間到一個字符串,我的setter方法只接受Timestamp對象。 無論如何,我能克服這個問題嗎? 在此先感謝!

感謝您的答案,這裏是我的代碼,並希望這將澄清我想要做的事:

public class myTest { 

    Date date = new Date(); 

    Timestamp timestamp = new Timestamp(date.getTime()); 

    myTestingClass testClass = new myTestingClass(); 

    @BeforeClass 
    public static void setUpBeforeClass() throws Exception { 
    } 

    @AfterClass 
    public static void tearDownAfterClass() throws Exception { 
    } 

    @Before 
    public void setUp() throws Exception { 


     testClass.setCreateDate(timestamp); 

    } 

    @After 
    public void tearDown() throws Exception { 
    } 

    @Test 
    public void test() { 
     try { 


      assertEquals(timestamp, testClass.getCreateDate()); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 

,當我嘗試運行它,它給了我下面的錯誤:

java.lang.AssertionError: expected:<2015-02-11 09:09:40.038> but was:<2015-02-11 09:09:40.04>

+0

您能解釋何時創建第二個Timestamp對象嗎?在你的(簡短的)示例代碼中,並不清楚導致問題的原因。 – 2015-02-11 07:58:13

+0

@Duncan我編輯了我的問題,謝謝你的評論! – tkyass 2015-02-11 14:19:35

回答

0

您可以在測試套件中創建單個時間戳記對象,將其設置爲您正在通過setter測試的類並在您的測試套件上進行驗證。在這種情況下,兩者都是相同的實例。

+0

這正是我試圖做的,但它給了我一個錯誤: – tkyass 2015-02-11 14:17:42

+0

生成日期,以及setUp()中的時間戳並嘗試。在setter之後和運行方法中放置一個打印件。 – 2015-02-11 14:27:27

+0

每個jUnit測試方法都有一個測試類的新實例。這就是setUp和tearDown方法用於重新初始化實例變量的原因。希望這是明確的。 – 2015-02-11 14:36:18

1

我最近有類似的問題。找到你的問題,但沒有接受答案,所以我想現在試着回答,因爲我設法解決我的問題。首先,看到myTestingClass,特別是setCreateDate(時間戳)方法的代碼將是有用的。 AssertionError的原因是使用兩個不同的時間戳對象。我的(大的)假設是,當myTestingClass在JUnit中實例化時,創建一個Timestamp對象。然後你比較這兩個對象。如果你想有這樣的代碼:

public class myTestingClass { 
    // other code ... 
    Timestamp timestamp; 

    public void setCreateDate(Timestamp timestamp) { 
     this.timestamp = timestamp; 
    } 

    public Timestamp getCreateDate() { 
     return timestamp; 
    } 
} 

然後創建Timestamp對象和測試的時刻之間的時間差會因爲你用同一個Timestamp對象和測試會通過無關。

P.S. Date類的很大一部分已被棄用,因此您應該考慮使用新類以實現相同目的 - LocalDate/LocalTime/LocalDateTime(Java 8和更高版本)。使用LocalDateTime創建時間戳將如下所示:

LocalDateTime now = LocalDateTime.now(); 
Timestamp timestamp = Timestamp.valueOf(now);