当前位置: 首页 > 知识库问答 >
问题:

使用RestTemplate测试RESTful服务

左丘嘉木
2023-03-14

在我的应用程序中,我有很多REST服务。我已经编写了所有服务的测试:

org.springframework.web.client.RestTemplate

REST服务调用(例如)如下所示:

final String loginResponse = restTemplate.exchange("http://localhost:8080/api/v1/xy", HttpMethod.POST, httpEntity, String.class)
        .getBody();

然后我检查了响应体-一切正常。缺点是,必须启动应用程序才能调用REST服务。

我现在的问题是如何在我的JUnit-@Test方法中做到这一点?它是一个Spring Boot应用程序(带有嵌入式tomcat)。

谢谢帮忙!

共有3个答案

林富
2023-03-14

由于您使用的是Spring MVC for REST,因此我建议您使用通过实例化MockMVC()提供的测试工具—启用测试,例如:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
 ... // any required Spring config
)
@WebAppConfiguration
public class RestControllerTest {

    @Autowired
    private WebApplicationContext context;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    }


    @Test
    public void getUserList() throws Exception {
        mockMvc.perform(get("/user"))
            .andExpect(status().isOk())
            .andExpect(content().contentType("application/json;charset=UTF-8")) 
            .andExpect(content().encoding("UTF-8"))
            .andExpect(jsonPath("$", hasSize(8)))
            .andExpect(jsonPath("$[0].id").exists())
            .andExpect(jsonPath("$[0].alias").exists())
            .andExpect(jsonPath("$[0].name").exists())
        );
    }
}

此单元测试将在不部署的情况下测试REST接口。具体来说,是否只返回8个用户,并且第一个用户具有“id”、“alias”和“name”字段。

jsonPath断言需要两个依赖项:

'com.jayway.jsonpath:json-path:0.8.1'
'com.jayway.jsonpath:json-path-assert:0.8.1'

也许还有:

'org.springframework:spring-test:4.1.7.RELEASE'
宗意蕴
2023-03-14

如果您不是在寻找端到端(integration)测试,MockRestServiceServer可能会对您有所帮助。我发现将测试用例与实际服务分离非常有用。

Spring doc说:

用于涉及直接或间接使用RestTemplate的测试。提供了一种设置预期请求的方法,这些请求将通过RestTemplate执行,并提供模拟响应以发送回,从而消除了对实际服务器的需要。

这是官方文件

还有一个提示是,requestTo不能自动导入

server.expect(manyTimes(), requestTo("/hotels/42")) ....

这是org的静态方法。springframework。测验网状物客户火柴MockRestRequestMatchers

云浩然
2023-03-14

文档中有一个关于这方面的好章节,我建议您通读它以充分了解您可以做什么。

我喜欢使用带有自定义配置的@IntegrationTest,因为这样可以启动整个服务器,并让您测试整个系统。如果您想用mock替换系统的某些部分,可以通过排除某些配置或bean并用您自己的替换它们来实现。

这里有一个小例子。我忽略了MessageService接口,因为从IndexController中可以明显看出它的作用,并且它是默认实现-DefaultMessageService-因为它不相关。

它所做的是,它旋转整个应用程序减去DefaultMessageService,而是使用它自己的MessageService。然后,它使用RestTemboard向测试用例中正在运行的应用程序发出真正的HTTP请求。

应用程序类别:

emo.java:

@SpringBootApplication
public class IntegrationTestDemo {

    public static void main(String[] args) {
        SpringApplication.run(IntegrationTestDemo.class, args);
    }

}

IndexController.java:

@RestController
public class IndexController {

    @Autowired
    MessageService messageService;

    @RequestMapping("/")
    String getMessage() {
        return messageService.getMessage();
    }
}

测试类:

IntegrationTestDemost。爪哇:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestConfig.class)
@WebIntegrationTest // This will start the server on a random port
public class IntegrationTestDemoTest {

    // This will hold the port number the server was started on
    @Value("${local.server.port}")
    int port;

    final RestTemplate template = new RestTemplate();

    @Test
    public void testGetMessage() {
        String message = template.getForObject("http://localhost:" + port + "/", String.class);

        Assert.assertEquals("This is a test message", message);
    }
}

TestConfig.java:

@SpringBootApplication
@ComponentScan(
    excludeFilters = {
        // Exclude the default message service
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = DefaultMessageService.class),
        // Exclude the default boot application or it's
        // @ComponentScan will pull in the default message service
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = IntegrationTestDemo.class)
    }
)
public class TestConfig {

    @Bean
    // Define our own test message service
    MessageService mockMessageService() {
        return new MessageService() {
            @Override
            public String getMessage() {
                return "This is a test message";
            }
        };
    }
}
 类似资料:
  • 问题内容: 我想直接通过HTTP测试我的RESTful应用程序,我正在寻找可以帮助我完成该任务的工具。基本上,我正在寻找一个HTTP请求的简单包装,该请求可以提交例如HTML表单或序列化资源(如JSON或XML)。 如果有一种方法可以验证服务是否确实遵循REST体系结构准则(无状态,URI,内容协商等),那将是很好的。 能够与JUnit一起使用将是一个方便的好处。您是否知道任何可以帮助我完成我想做

  • 我正在使用获取对象。但是当我在客户端运行Main时出现错误,请告诉我如何修复它??? 线程“main”org.springframework.http.converter.httpMessageNotreadableException:无法读取JSON:无法将edu.java.spring.service.user.model.user实例反序列化出START_ARRAY令牌[source:sun

  • 问题内容: 我正在使用RestTemplate 方法将正文发布到端点。我需要使用Mockito为我的代码编写测试用例的帮助。返回类型为void,但是可以将其更改为,或者需要进行测试。我已经提到了许多其他文档,但是它们非常笼统,我尝试使用它们,但是由于and和return类型是不同的,所以大多数对我来说都不起作用。。任何建议表示赞赏。谢谢 这是我的Java课 问题答案: 您正在测试MyClass类中

  • 如果需要从应用程序调用远程REST服务,可以使用Spring Framework的RestTemplate类。 由于RestTemplate实例在使用之前通常需要进行自定义,因此Spring Boot不提供任何单个自动配置的RestTemplate bean。 但是,它会自动配置RestTemplateBuilder,可用于在需要时创建RestTemplate实例。 自动配置的RestTempla

  • 我RestClient应该使用来自多个服务器的服务,每个服务器具有不同的主机名和凭据。 我知道是线程安全的,并且为每个任务创建不同的连接,但是如何使用不同的凭据来完成呢?凭据不是在创建时提供给RestTemplate的吗?

  • 问题内容: 谁能提供给我一个代码示例,以使用Spring Rest模板访问通过https保护的REST服务URL。 我有证书,用户名和密码。服务器端使用了基本身份验证,我想创建一个可以使用提供的证书,用户名和密码(如果需要)连接到该服务器的客户端。 问题答案: