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

模拟子服务的REST请求

李昱
2023-03-14

我尝试使用mockmvc在集成测试套件中测试@RestController

@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class WebControllerIT {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

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

    @Test
    public void getStatusReurnsSomething() throws Exception {
        this.mockMvc.perform(get("/status")).andExpect(status().isOk());
    }
}

@RestController(WebController)调用注入的@service(RestClientService),后者使用RestTemplate调用另一个REST服务器。这导致运行测试时出现以下错误。

resourceAccessException:获取“http://test123.com/42/status”的请求时出现I/O错误:test123.com;嵌套异常为java.net.UnknownHostException:test123.com

我使用mockrestServiceServer@service本身进行集成测试,但不知道如何在@restcontroller的测试中存档。

如何模拟RestTemplate的正确REST调用?

@RestController类。

@RestController
public class WebController {
    private final RestClientService service;

    @Autowired
    public WebController(RestClientService service) {this.service = service;}

    @GetMapping("/status")
    public String getStatus() {
        // extract pid from database ...
        int pid = 42;

        return this.service.getStatus(42);
    }
}

@service类。

@Service
public class RestClientService {
    private final RestTemplate restTemplate;

    public RestClientService(RestTemplate restTemplate) {this.restTemplate = restTemplate;}

    public String getStatus(int pid) {
        String url = String.format("http://test123.com/%d/status", pid);
        return this.restTemplate.getForObject(url, String.class);
    }
}

共有1个答案

包兴思
2023-03-14

集成/单元测试不是这样工作的,这种测试的目标是运行您的代码,确保满足所有的业务需求,但不是访问其他系统或DB,在这里,您不应该访问test123.com来获取数据,这里需要做的是模拟该方法

public String getStatus(int pid) {
    String url = String.format("http://test123.com/%d/status", pid);
    return this.restTemplate.getForObject(url, String.class);
}

这样控件就不会输入此方法,而是返回模拟数据(Dummy data)。

例如,假设该方法返回两种状态,您需要根据返回字符串进行一些业务验证。在这种情况下,您需要编写两个集成测试,并确保模拟方法返回两个不同的值(虚拟值,而不是到达终点)

我们之所以编写单元测试/集成测试,是为了确保您的整个代码按照预期工作,而不是从您的代码攻击其他系统。

 类似资料:
  • 我正在编写一个junit测试用例来测试rest调用。 我试图嘲笑售票服务,它工作正常,但当我在REST服务调用中嘲笑它时。它不嘲笑。 我正在使用springboot,mongodb与REST。 有什么解决这个问题的建议吗? }

  • 我在JUnit中使用Mockito,并且我有一个使用RestTemboard向微服务发出请求的方法。 此方法返回一个JSON对象,该对象将在TokenRequestorPayload类中反序列化。 当我执行单元测试时,它们会失败,因为mock不起作用,我得到了一个org.springframework.web.client.ResourceAccessExcure。我怎么能嘲笑我的RestTem板

  • 我对Spring MVC中的模拟服务有一个问题: 和测试: 问题是,为什么我从真正的服务而不是模拟中得到公司(公司1,公司2): 更新了测试类,删除了setUp并将@Bean更改为@MockBean,但保留@SpringBootTest并且它可以工作: }

  • 我有以下服务: 和其他服务 我有我的Junit 当我在调试模式下运行这个测试时,我看到这个。合同服务。getInfo(multipartFileId) 正在返回我“null”。 我在嘲弄中错在哪里。 我刚刚在JUnit中嘲笑了ContractService。我还需要模拟AccountServiceImpl吗? 编辑:添加saveInCache和getInfo方法

  • 我可以使用通过web服务请求授予的访问令牌,通过GoogleAPI访问网站管理员的网站列表,现在我想通过服务器到服务器请求来访问。 在授予服务器帐户访问列表的权限后,我不能使用下面的作用域正确使用setAssertionCreentials: 案例1 模拟用户帐户时: PHP客户端返回 案例2 在不模拟用户帐户的情况下,PHP客户端会得到一个空数组 问题 如何冒充用户使用服务器服务器谷歌为网站管理

  • 我正在使用Modeshape rest服务器。Modeshape的版本是2.8.2。 当我向诸如这样的节点发送GET请求时,它会返回关于该节点的信息。 但是当我在同一个地址上发送删除请求(例如,使用Fiddler)时,它返回。根据文档,这样的地址应该支持删除请求。 更详细。我发送 我得到了 pom.xml,我正在使用它构建rest-server.war 我做错什么了吗? 而且我也在使用jboss-