2016-06-09 112 views
0

我想爲我的控制器進行單元測試。 下面是從我控制器的方法,我想測試:單元測試包含自定義驗證的控制器

public class SomeController { 

    @Autowired public RequestValidator reqValidator; 
    @Autowired public SomeService service; 

    @ResponseBody 
    @RequestMapping(value = "/Inquiry", method = RequestMethod.GET) 
    public String inquiry(HttpServletRequest httpServletRequest, @ModelAttribute Request req, BindingResult bindingResult) { 

     reqValidator.validate(req, bindingResult); 
     if (bindingResult.hasErrors()) { 
      return something; 
     } 
     return service.inquiry(req); 
    } 
} 

ReqValidator是自定義驗證我實施檢查每個請求字段爲空,太長了,一些其他的東西,我不能用Hibernate實現驗證器。

無論如何,我正在測試這種方法的成功情況。這是我的測試方法。

public class SomeControllerTest { 

    @Mock private RequestValidator reqValidator; 
    @Mock private SomeService service; 
    @InjectMocks private SomeController controller; 

    private MockMvc mockMvc; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
     mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); 
    } 

    @Test 
    public void testInquiry_success() throws Exception { 
    when(service.inquiry(any(Request.class))).thenReturn(res); 
    mockMvc.perform(get("/Inquiry") 
      .param("email", "[email protected]") 
      .param("phoneNumber", "01189998819991197253") 
      ) 
      .andExpect(status().isOk()) 
      .andExpect(content().string(res)); 
    } 
} 

上述測試進行得很順利。但是當我想要測試負面情景時,我就陷入了困境,例如,其中一個領域是空的。測試似乎沒有進入reqValidator.validate()方法。即使我將電子郵件和電話號碼設爲空。我如何才能測試負面情況?我如何讓我的測試進入驗證?

下面是我自定義的驗證類,它實現了spring的Validator。

@Component 
public class RequestValidator implements Validator { 

    // omitted to be concise 

    @Override 
    public void validate(Object o, Errors errors) { 
     // validate something 
    } 
} 

我希望我能解釋我的自我。 謝謝。

+0

測試代碼看起來不完整。 mockMvc和服務從哪裏來?你能發佈完整的代碼嗎?它看起來像你在嘲笑服務,莫名其妙地與mockMvc進行交互。 – hulkmeister

+0

我編輯了代碼。 –

+0

你正在使用哪個模擬框架? – Raedwald

回答

0

您的單元測試永遠不會實際調用reqValidator.validate()方法,因爲reqValidator.validate()是無效方法。

在mockito中,void方法在mock上默認不做任何事情。如doNothing()文檔中所述。如果你想實際運行void方法,你可以使用doCallRealMethod()

+0

但實際運行void方法對於單元測試來說是不好的,不是嗎?因爲據我所知,單元測試只能在一個類中被隔離 –