2015-09-27 57 views
0

這是我的測試:的Mockito驗證後的對象具有不相同的值相同的對象引用

@Test 
    public void shouldProcessRegistration() throws Exception { 
     Spitter unsaved = new Spitter("Gustavo", "Diaz", "gdiaz", "gd123"); 
     Spitter saved = new Spitter(24L, "Gustavo", "Diaz", "gdiaz", "gd123"); 
     SpitterRepository spittlerRepository = Mockito.mock(SpitterRepository.class); 
     Mockito.when(spittlerRepository.save(unsaved)).thenReturn(saved); 

     SpitterController spittleController = new SpitterController(spittlerRepository); 

     MockMvc mockSpittleController = MockMvcBuilders.standaloneSetup(spittleController).build(); 

     mockSpittleController.perform(MockMvcRequestBuilders.post("/spitter/register") 
       .param("firstName", "Gustavo") 
       .param("lastName", "Diaz") 
       .param("userName", "gdiaz") 
       .param("password", "gd123")) 
       .andExpect(MockMvcResultMatchers.redirectedUrl("/spitter/" + saved.getUserName())); 

     Mockito.verify(spittlerRepository, Mockito.atLeastOnce()).save(unsaved); 
    } 

這是我的控制器:

@Controller 
@RequestMapping(value = "spitter") 
public class SpitterController { 
    SpitterRepository spitterRepository; 

    @Autowired 
    public SpitterController(SpitterRepository spittlerRepository) { 
     this.spitterRepository = spittlerRepository; 
    } 

    @RequestMapping(value = "/register", method = RequestMethod.POST) 
    public String processRegistration(Spitter spitter){ 
     spitterRepository.save(spitter); 

     return "redirect:/spitter/" + spitter.getUserName(); 
    } 
} 

我想驗證spitterRepository.save被稱爲傳球同樣unsaved我在測試中定義了對象。但我得到這個例外:

Argument(s) are different! Wanted: 
spitterRepository.save(
    [email protected] 
); 
-> at spitter.controllers.test.SpitterControllerTest.shouldProcessRegistration(SpitterControllerTest.java:48) 
Actual invocation has different arguments: 
spitterRepository.save(
    [email protected] 
); 

回答

1

如果我理解正確,下面的行初始化一個模擬,你可以利用Spring的功能。

MockMvc mockSpittleController = MockMvcBuilders.standaloneSetup(spittleController).build(); 

當你調用像下面的模擬,你不會打電話與unsaved對象的方法。相反,我猜想會創建一個新對象。

mockSpittleController.perform(MockMvcRequestBuilders.post("/spitter/register") 
      .param("firstName", "Gustavo") 
      .param("lastName", "Diaz") 
      .param("userName", "gdiaz") 
      .param("password", "gd123")) 
      .andExpect(MockMvcResultMatchers.redirectedUrl("/spitter/" + saved.getUserName())); 

這使得驗證失敗,因爲實例不會相同。

爲了解決這個問題,你應該確保Spitter實現equals()然後用eq()匹配的驗證:

Mockito.verify(spittlerRepository, Mockito.atLeastOnce()).save(org.mockito.Matchers.eq(unsaved)); 

這將檢查預期參數equals()什麼獲得通過。

+0

我把這樣的模擬,因爲我模仿表單提交。是不是有另一種方法來比較值?,因爲重寫equals方法修改我的類行爲只是爲了完成一個斷言。 –

+0

在這種情況下,您應該使用@Ruben提出的解決方案。 – Magnilex

1

使用ArgumentCaptor捕獲傳遞來保存的值,然後對其進行斷言。

ArgumentCaptor<Spitter> spitterArgument = ArgumentCaptor.forClass(Spitter.class); 
verify(spittlerRepository, atLeastOnce()).save(spitterArgument.capture()); 

assertEquals("Gustavo", spitterArgument.getValue().getName()); 

對於聲稱如果bean是一樣的,我會建議你使用Hamcrest的samePropertyValues(http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/beans/SamePropertyValuesAs.html

0
import org.mockito.Matchers; 
//... 
Mockito.verify(spittlerRepository, Mockito.atLeastOnce()).save(Matchers.refEq(unsaved)); 
相關問題