2009-05-18 74 views
13

我正在遷移Spring MVC控制器以使用更新的樣式註釋,並希望單元測試驗證命令對象的控制器方法(請參閱下面的簡單示例)。使用註釋模仿Spring MVC BindingResult

@RequestMapping(method = RequestMethod.POST) 
public String doThing(Command command, BindingResult result, 
        HttpServletRequest request, HttpServletResponse response, 
        Map<String, Object> model){ 
    ThingValidator validator = new ThingValidator(); 
    validator.validate(command, result); 
... other logic here 
    } 

我的問題是我要叫我的單元測試控制器的方法,並提供模擬值,以滿足其簽名恰當地執行代碼,我不能工作,如何嘲笑一個BindingResult。

在老式控制器中,簽名只需要一個HttpServletRequest和HttpServletResponse,它們很容易實現,但由於新註釋風格的靈活性,必須通過簽名傳遞更多內容。

如何模擬一個單元測試中使用的Spring BindingResult?

回答

15

BindingResult是一個接口,所以你不能簡單地通過該接口的一個Springs實現嗎?

我沒有在我的Spring MVC中的代碼使用註釋,但是當我想測試驗證程序的驗證方法,我傳遞中的BindException的一個實例,然後使用它的assertEquals等

+4

嗨馬克, ,這讓我在正確的軌道謝謝。使用一個 BindingResult bindingResult = new BeanPropertyBindingResult(command,「command」);並且在我的測試中在模型中粘貼命令對象似乎將我的測試排除在外。 – 2009-05-18 14:23:19

+1

我也是這麼做的。 – 2009-05-20 01:23:31

14

返回值你也可以使用像Mockito創建BindingResult的模擬,並傳遞到你的控制器的方法,即

import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 
import static org.mockito.Mockito.verifyZeroInteractions; 

@Test 
public void createDoesNotCreateAnythingWhenTheBindingResultHasErrors() { 
    // Given 
    SomeDomainDTO dto = new SomeDomainDTO(); 
    ModelAndView mv = new ModelAndView(); 

    BindingResult result = mock(BindingResult.class); 
    when(result.hasErrors()).thenReturn(true); 

    // When 
    controller.create(dto, result, mv); 

    // Then 
    verifyZeroInteractions(lockAccessor); 
} 

這可以給你更多的靈活性和簡化了腳手架。