如何使用 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);
    }
}