【发布时间】:2016-07-31 08:02:54
【问题描述】:
是否可以使用MockMvc 和MockitoJUnitRunner 测试@Valid 注释?我可以测试我的 CRUD 控制器的大部分行为,但验证似乎需要使用 Spring 的 JUnit 运行器,构建整个上下文并创建需要很多东西的 JPA 存储库实现。
下面的测试尝试测试接收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
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);
}
【问题讨论】:
标签: validation unit-testing spring-mvc mockito spring-data-jpa