如何使用 JUnit 测试 Spring REST 消费者
How to test a Spring REST consumer with JUnit
我正在创建一个基于 Java Spring 的微服务应用程序,该应用程序使用 REST 端点进行通信。
到目前为止,应用程序本身具有一个简单的结构:UI <-> DBLayer。 UI 模块是 api 消费者,DBLayer 是 api 提供者。
也就是说,我想测试我的 UI 是否使用 JUnit and/or Mockito 进行 正确的 REST 调用。更具体地说,假设我有这样的服务 class:
@Service
public class AuthorityService {
@Autowired
private RestTemplate restTemplate;
public Authority getAuthority(String authorityName) {
Authority authority =
restTemplate.getForObject(
"http://localhost:8080/authorities/" + authorityName,
Authority.class);
return authority;
}
}
为了测试此服务方法,我想以某种方式验证是否确实调用了此端点。有没有办法包装服务方法并以某种方式断言正在进行的休息 GET/POST/PUT 等调用?
所需的测试 class 应如下所示:
public class AuthorityServiceTest {
private AuthorityService authorityService = new AuthorityService();
@Test
public void getAuthorityTest(){
Assert.assertHttpGETCallMade(
authorityService.getAuthority("test"),
"http://localhost:8080/authorities/test");
}
}
您可以使用Mockito注入模板,然后验证调用。
@ExtendWith(MockitoExtension.class) // RunWith(MockitoJUnitRunner.class) for JUnit 4
public class AuthorityServiceTest {
@InjectMocks
private AuthorityService sut;
@Mock RestTemplate restTemplate;
@Test
public void getAuthorityTest(){
// mock rest call
Authority auth = mock(Authority.class);
when(restTemplate.getForObject(any(String.class), any(Class.class)).thenReturn(auth);
Authority result = sut.getAuthority("test");
// verify mock result was returned
assertSame(auth, result);
// verify call to rest template was performed
verify(restTemplate).getForObject(
"http://localhost:8080/authorities/test",
Authority.class);
}
}
我正在创建一个基于 Java Spring 的微服务应用程序,该应用程序使用 REST 端点进行通信。
到目前为止,应用程序本身具有一个简单的结构:UI <-> DBLayer。 UI 模块是 api 消费者,DBLayer 是 api 提供者。
也就是说,我想测试我的 UI 是否使用 JUnit and/or Mockito 进行 正确的 REST 调用。更具体地说,假设我有这样的服务 class:
@Service
public class AuthorityService {
@Autowired
private RestTemplate restTemplate;
public Authority getAuthority(String authorityName) {
Authority authority =
restTemplate.getForObject(
"http://localhost:8080/authorities/" + authorityName,
Authority.class);
return authority;
}
}
为了测试此服务方法,我想以某种方式验证是否确实调用了此端点。有没有办法包装服务方法并以某种方式断言正在进行的休息 GET/POST/PUT 等调用?
所需的测试 class 应如下所示:
public class AuthorityServiceTest {
private AuthorityService authorityService = new AuthorityService();
@Test
public void getAuthorityTest(){
Assert.assertHttpGETCallMade(
authorityService.getAuthority("test"),
"http://localhost:8080/authorities/test");
}
}
您可以使用Mockito注入模板,然后验证调用。
@ExtendWith(MockitoExtension.class) // RunWith(MockitoJUnitRunner.class) for JUnit 4
public class AuthorityServiceTest {
@InjectMocks
private AuthorityService sut;
@Mock RestTemplate restTemplate;
@Test
public void getAuthorityTest(){
// mock rest call
Authority auth = mock(Authority.class);
when(restTemplate.getForObject(any(String.class), any(Class.class)).thenReturn(auth);
Authority result = sut.getAuthority("test");
// verify mock result was returned
assertSame(auth, result);
// verify call to rest template was performed
verify(restTemplate).getForObject(
"http://localhost:8080/authorities/test",
Authority.class);
}
}