Spring MVC Controller的单元测试:未能完全执行请求

时间:2015-07-21 12:31:03

标签: spring unit-testing junit mockito

我有一个简单的控制器定义如下:

@Controller
@RequestMapping("/rest/tests")
public class TestController {

    @Autowired
    private ITestService testService;

    @RequestMapping(value="/{id}", method=RequestMethod.DELETE)
    @ResponseStatus(value = HttpStatus.OK)
    public void delete(@PathVariable Integer id)
    {
        Test test = testService.getById(id);
        testService.delete(test);
    }
}

我一直在尝试测试删除方法,到目前为止还没有成功。我写的测试也很简单。

public class MockmvcTest {

    @InjectMocks
    private TestController test;

    private MockMvc mockMvc;

    @Before
    public void setup() {
         MockitoAnnotations.initMocks(this);
         mockMvc = MockMvcBuilders.standaloneSetup(test).build();
    }

    @Test
    public void myTest() throws Exception {
        this.mockMvc.perform(delete("/rest/tests/{id}", new Integer(4)))
        .andExpect(status().isOk()      
    }
}

我已经使用"高级休息客户端"测试了该方法。在chrome中扩展,它按预期工作。

通过工作,我的意思是从数据库中删除具有给定id的实体。

执行myTest()时,状态代码仍为200,但实体未从数据库中删除。

这种行为背后可能是什么原因?

1 个答案:

答案 0 :(得分:1)

您正在使用Mockito将模拟服务bean注入TestController(特别是ITestService)。根据定义,所有模拟在指定之前都没有行为,默认情况下,您执行的所有操作都将不执行任何操作或返回null。您可以通过在TestController.delete方法中设置断点,在调试模式下执行测试并检查testtestService变量的值来轻松确认。

Mockito用于单元级别的测试,可以使用您设置为以某种可验证方式运行的模拟替换SUT's协作者。一旦你在你的SUT上调用一个方法(在你的情况下是TestController),你就可以断言它是否遵守了它的合同。

允许自动化测试修改数据库的实际实例实际上是一个很大的禁忌。