我有一个简单的控制器定义如下:
@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
,但实体未从数据库中删除。
这种行为背后可能是什么原因?
答案 0 :(得分:1)
您正在使用Mockito将模拟服务bean注入TestController
(特别是ITestService
)。根据定义,所有模拟在指定之前都没有行为,默认情况下,您执行的所有操作都将不执行任何操作或返回null
。您可以通过在TestController.delete
方法中设置断点,在调试模式下执行测试并检查test
和testService
变量的值来轻松确认。
Mockito用于单元级别的测试,可以使用您设置为以某种可验证方式运行的模拟替换SUT's协作者。一旦你在你的SUT上调用一个方法(在你的情况下是TestController
),你就可以断言它是否遵守了它的合同。
允许自动化测试修改数据库的实际实例实际上是一个很大的禁忌。