是否可以使用@Valid
和MockMvc
来测试MockitoJUnitRunner
注释?我可以测试我的CRUD控制器的大多数行为,但验证似乎需要使用Spring的JUnit运行程序,构建整个上下文并创建需要大量内容的JPA repo实现。
下面的测试尝试测试接收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界面:
@Repository
public interface CustomerRepository extends JpaRepository<Customer, Long> {
List<Customer> findByLastName(String lastName);
}
答案 0 :(得分:1)
SpringJUnit4ClassRunner
的目的是自动加载应用程序上下文并自动连接所有内容。您应该能够使用MockitoJUnitRunner
,但是您必须在测试中手动加载要手动使用的应用程序上下文。但是,无论如何,您确实需要加载应用程序上下文,因为通过Spring调用DataController#add()
是处理@Valid
注释的唯一方法。
编辑:如果这里的真正问题是加载JPA存储库,您可以使用MockitoJUnitRunner
并加载一个测试应用程序上下文,其中手动连接模拟JPA存储库,几乎没有任何费用。