使用MockMvc进行单元测试字段验证但没有Spring上下文?

时间:2016-04-10 07:19:34

标签: validation unit-testing spring-mvc mockito spring-data-jpa

是否可以使用@ValidMockMvc来测试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);
}

1 个答案:

答案 0 :(得分:1)

SpringJUnit4ClassRunner的目的是自动加载应用程序上下文并自动连接所有内容。您应该能够使用MockitoJUnitRunner,但是您必须在测试中手动加载要手动使用的应用程序上下文。但是,无论如何,您确实需要加载应用程序上下文,因为通过Spring调用DataController#add()是处理@Valid注释的唯一方法。

编辑:如果这里的真正问题是加载JPA存储库,您可以使用MockitoJUnitRunner并加载一个测试应用程序上下文,其中手动连接模拟JPA存储库,几乎没有任何费用。