我正在做一个Java项目,并尝试使用Mockito。下面是我的测试代码:
@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
public class TestMainController {
@MockBean
MainController mainController;
@MockBean
AnotherServiceImpl anotherService;
@Autowired
private MockMvc mockMvc;
@Before
public void setup() {
mockMvc = MockMvcBuilders.standaloneSetup(mainController).build();
}
@Test
public void TestFirstFunctionFor201() throws Exception {
String req = "<JSON_STRING>";
when(anotherService.someFunction(Mockito.anyString())).thenReturn("Success");
this.mockMvc.perform(put("/Main/one/").contentType(MediaType.APPLICATION_JSON)
.content(req)).andExpect(status().isCreated());
}
}
当然我必须更改名称。下面是控制器代码:
@PutMapping("/Main/one")
public ResponseEntity<String> firstFunction(@RequestBody RequestObject requestObject){
String result = anotherService.someFunction(requestOject.getName());
if(Objects.equals(result, "Success")){
return new ResponseEntity<>(result, HttpStatus.CREATED);
}
return new ResponseEntity<>(result, HttpStatus.BAD_REQUEST);
}
所以我模拟firstFunction
返回“Success”,但是我没有得到结果。相反,实际的函数正在执行。只有当req
是合适的时候,测试用例才通过。换句话说,函数没有被模拟。
请帮帮忙。
1条答案
按热度按时间laik7k3q1#
你不需要模拟你想要测试的类或者方法。模拟背后的思想是模拟你的依赖项。在你的例子中,你想要测试的类是
MainController
,它依赖于AnotherServiceImpl
。没关系,你已经模拟了你的依赖项,所以你不需要模拟MainController
。此外,这里您正在进行一个 * 集成测试 *,因为注解
@SpringBootTest
将加载您的所有上下文。我猜这不是您在使用MockMvc
时所希望的。您必须使用test slice代替注解@WebMvcTest(MainController.class)
。您的类应该类似于: