2016-04-10 33 views
1

是否可以使用MockMvcMockitoJUnitRunner來測試@Valid註釋?我可以測試我的CRUD控制器的大部分行爲,但驗證似乎需要使用Spring的JUnit runner,構建整個上下文並創建需要大量內容的JPA repo實現。使用MockMvc但沒有Spring上下文的單元測試字段驗證?

以下測試嘗試測試接收Customer實體的POST方法,其中firstName字段用@Size(min=2, max=20)進行註釋。結果是

java.lang.AssertionError: View name expected:<edit> but was:<redirect:/info> 

所以驗證沒有運行。

@RunWith(MockitoJUnitRunner.class) 
public class DataControllerTest { 
    @Mock 
    CustomerRepository mockRepo; 

    @InjectMocks 
    private DataController controller; 

    MockMvc mockmvc; 

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

    @Test 
    public void testBadSubmit() throws Exception { 
     mockmvc.perform(MockMvcRequestBuilders.post("/edit/1") 
      .param("firstName", "a")) 
      .andExpect(MockMvcResultMatchers.view().name("edit")); 
     Mockito.verifyZeroInteractions(mockRepo); 
    } 
} 

Controller類:

@Controller 
public class DataController { 
    @Autowired 
    public CustomerRepository crep; 

    ... 

    @RequestMapping(value = {"/edit/{id}"}, method = RequestMethod.POST) 
    public String add(Model model, @Valid Customer customer, Errors result) { 
     if (result.hasErrors()) { 
      return "edit"; 
     } 
     crep.save(customer); 
     return "redirect:/info"; 
    } 

實體:

@Entity 
public class Customer { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id = null; 

    @Column(length=20) 
    @Size(min=2, max=20) 
    private String firstName; 
    ... 
} 

JPA庫接口:

@Repository 
public interface CustomerRepository extends JpaRepository<Customer, Long> { 

    List<Customer> findByLastName(String lastName); 
} 

回答

1

SpringJUnit4ClassRunner所述的目的是自動加載應用程序C上下文並自動連線。您應該可以使用MockitoJUnitRunner,但您必須在測試中手動加載要使用的應用程序上下文。無論如何,您確實需要加載應用程序上下文,因爲通過Spring調用DataController#add()是處理@Valid註釋的唯一方法。

編輯:如果真正的問題是加載JPA存儲庫,您可以使用MockitoJUnitRunner,只需加載測試應用程序上下文,其中模擬JPA存儲庫手動接入,幾乎沒有任何費用。

+0

我不知道如何創建一個應用程序上下文來處理'@ Valid'註解,但不會抱怨丟失的JPA存儲庫bean,除非我設置了@Autowired(required = false)'。 – Arthur

+0

只要封閉類連接到測試類或由應用程序上下文的測試類檢索,就會測試'@ Valid'註釋。讓我知道你是否需要一些示例代碼。 – entpnerd

+0

如果這不是一個大問題,請舉例說明。 – Arthur