需要对restTemplate.exchange(设备侧)打mock,而不是对service层上的controller打mock,
对数据库等中间件都要打桩,所以要用到@Profile分离配置,详见上一篇:
https://blog.csdn.net/jass535/article/details/109461642
mock的一般用法:https://blog.csdn.net/wo541075754/article/details/88983708
mock本身不难,但是对resttemplate打桩就有点麻烦了:
https://stackoverflow.com/questions/42406625/how-to-mock-resttemplate-in-java-spring:
@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {
@Mock
RestTemplate restTemplate;
@InjectMocks
@Spy
Service service;
ResponseEntity responseEntity = mock(ResponseEntity.class);
//事实证明,我们用的return值是个具体的Entity,而不是mock出来的,所以不能这么写
@Test
public void test() throws Exception {
Mockito.when(restTemplate.getForEntity(
Mockito.anyString(),
ArgumentMatchers.any(Class.class)
))
.thenReturn(responseEntity);
boolean res = service.isEnabled("something");
Assert.assertEquals(res, false);
}
遇到的坑就是代码里注释的那一句,根据这篇文章,判断给的return应该是个实体ResponseEntity:
https://www.baeldung.com/spring-mock-rest-template
@Test
public void givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject() {
Employee emp = new Employee(“E001”, "Eric Simmons");
//就是从这句得到的灵感
Mockito
.when(restTemplate.getForEntity(
“http://localhost:8080/employee/E001”, Employee.class))
.thenReturn(new ResponseEntity(emp, HttpStatus.OK));
Employee employee = empService.getEmployee(id);