2016-08-29 40 views
1

希望瞭解如何在將新對象傳遞給控制器​​時編寫JUnit測試用例。如何爲新對象使用Junit?

以下是Spring MVC控制器中傳遞新PriceIncrease對象的一段代碼。

@RequestMapping(method=RequestMethod.GET, value="/priceincrease") 
public String showPriceIncreasePage(Map<String, Object> map){ 
    map.put("priceIncrease", new PriceIncrease()); 

    logger.info("Returning Price Increase home page"); 
    return priceIncreasePage; 
} 

單元測試我有,這當然是不正確的,因爲它會失敗。

@Test 
public void testShowPriceIncreasePage(){ 
    String viewName = inventoryController.showPriceIncreasePage(model); 

    /* Expecting to return the new object of PriceIncrease*/ 
    assertEquals(new PriceIncrease(), model.get("priceIncrease")); 

    //assertEquals(InventoryController.priceIncreasePage, viewName); 
} 

我們應該在什麼時候使用以確保在Junit測試中返回相同的對象。我不確定這是否正確。

@Test 
public void testShowPriceIncreasePage(){ 
    String viewName = inventoryController.showPriceIncreasePage(model); 

    /* Expecting to return the new object of PriceIncrease*/ 
    PriceIncrease priceIncrease = new PriceIncrease(); 
    when(model.get("priceIncrease")).thenReturn(priceIncrease); 
    assertEqual(priceIncrease, model.get("priceIncrease")); 
} 

在此先感謝

回答

0

編寫良好的測試是一個非常廣泛的主題,一個是你應該潛入如果你想寫出真正好的和有用的測試。

爲了您的例子來說:

  • 測試不應該以「test」開頭,除非你使用JUnit 3.x的名稱JUnit的4.x版提供@Test標註來標記的測試方法,測試
  • 名稱應該告訴讀者什麼是你從單元測試預期,
  • 試驗應遵循given/when/then結構。 given:在這個塊中你設置了系統的狀態,when:你打電話給你的代碼將被測試的地方,then:是你評估結果的地方(所有的斷言應該在這裏)
  • 你想要斷言從控制器的方法返回的值等於「所需」之一,並且您的模型包含特定對象,
  • 我沒有看到PriceIncrease的任何代碼,但我認爲它沒有equals/hashCode方法實施?如果是這種情況,代碼將不起作用。
  • 添加equals/hashCodePriceIncrease將幫助你和你正在寫

你的測試看起來應該更少這樣的測試:

@Test 
public void shouldRedirectToPriceIncreasePageWithModelValuesSetCorrectly(){ 
    // given 
    Map<String, Object> model = new HashMap<>(); 

    // when 
    String viewName = inventoryController.showPriceIncreasePage(model); 

    // then 
    assertEqual(viewName, "some-view-name"); 
    assertEqual(model.get("priceIncrease"), new PriceIncrease()); 
    assertEqual(model.size(), 1); 
} 

如果你想提高你的考試寫作技巧,然後考慮這些書籍Tomasz Kaczanowski: