是否可以使用MockMvc
和MockitoJUnitRunner
來測試@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);
}
我不知道如何創建一個應用程序上下文來處理'@ Valid'註解,但不會抱怨丟失的JPA存儲庫bean,除非我設置了@Autowired(required = false)'。 – Arthur
只要封閉類連接到測試類或由應用程序上下文的測試類檢索,就會測試'@ Valid'註釋。讓我知道你是否需要一些示例代碼。 – entpnerd
如果這不是一個大問題,請舉例說明。 – Arthur