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

我们可以用类似于Wiremock的方式插入Spring Boot Test、Mockito或powerMock吗

公羊向荣
2023-03-14

就集成测试而言,Wiremock确实非常强大。我喜欢Wiremock在不改变beans的情况下处理< code>URL响应的方式(我们在mockito或powermock中进行单元测试的方式)。

    @Mock
    SomeRepository someRepository; //Zombie mutation

    @Mock
    AnotherComponent anotherComponent; //mutation

    @InjectMocks
    SomeService someService; //mutation - This is the class we are unit testing

在集成测试中,我希望所有3个层都得到测试并模拟外部依赖

                      +---> Repository -----> MySQL (I managed this with in-memory h2 database)
                      |
controller---> service 
                      | 
                      +---> Proxy ---------> Another REST service (some way to mock the call???)

是否可以对 Spring 启动测试、mockito 或 powermock 做同样的事情(因为我已经在使用它们,只是不想向项目添加新库)

以下是我们如何在Wiresck中进行存根。

 service.stubFor(get(urlEqualTo("/another/service/call"))
                .willReturn(jsonResponse(toJson(objResponse))));

上面的代码意味着,在我们的测试中,每当调用外部服务(http://example.com/another/service/call)时,它都会被拦截并注入示例响应——并且外部调用不会离开系统

示例代码

@SpringBootTest
@AutoConfigureMockMvc
public class StubTest {
    @Autowired
    private MockMvc mockMvc;

    private MockRestServiceServer server;

    @BeforeEach
    public void init() {
        RestTemplate restTemplate = new RestTemplate();
        server = MockRestServiceServer.bindTo(restTemplate).build();
    }

    @Test
    public void testFakeLogin() throws Exception {
        String sampleResponse = stubSampleResponse();

        //Actual URL to test
        String result = mockMvc.perform(get("/s1/method1")
                .contentType("application/json"))
                .andExpect(status().isOk()).andReturn().getResponse().getContentAsString();

        assertThat(result).isNotNull();
        assertThat(result).isEqualTo(sampleResponse);
    }

    private String stubSampleResponse() {

        String response = "Here is response";

        //URL to stub (this is in another service)
        server.expect(requestTo("/v1/s2/dependent-method"))
                .andExpect(method(HttpMethod.GET))
                .andRespond(withSuccess(response, MediaType.APPLICATION_JSON));

        return response;
    }
}

Feign客户

@FeignClient(value = "service-s2", url = "http://localhost:8888/")
public interface S2Api {
    @GetMapping("/v1/s2/dependent-method")
    public String dependentMethod();
}

但我得到了以下错误,这意味着这个url没有被存根。

feign.RetryableException: Connection refused: connect executing GET http://localhost:8888/v1/s2/dependent-method
    at feign.FeignException.errorExecuting(FeignException.java:213) ~[feign-core-10.4.0.jar:na]

共有1个答案

马阳晖
2023-03-14

是的,使用< code > MockRestServiceServer 是可能的。

例子:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.*;
import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
import org.springframework.test.web.client.MockRestServiceServer;
import org.springframework.boot.test.autoconfigure.web.client.AutoConfigureWebClient;
import org.springframework.boot.test.autoconfigure.web.client.RestClientTest;

@RunWith(SpringRunner.class)
@RestClientTest(MyRestClient.class)
@AutoConfigureWebClient(registerRestTemplate = true)
public class MyRestClientTest {
    @Autowired
    private MockRestServiceServer server;

    @Test
    public void getInfo() {
        String response = "response";
        server.expect(requestTo("http://localhost:8090" + "/another/service/call"))
            .andExpect(method(HttpMethod.GET))
            .andRespond(withSuccess(response,MediaType.APPLICATION_JSON));
    }
}
 类似资料:
  • 从Java插入时,插入速度约为每秒2500行。即使在我测量for循环之后和ExecuteBatch之前的时间时也是如此。因此“创建”内存中的数据并不是瓶颈。 使用批量插入进行插入时,插入速度约为每秒30000行。 这两个测试都是在服务器上完成的。所以网络也不是瓶颈。为什么批处理插入更快,有什么线索吗?如果在Java中也能获得同样的性能呢?

  • 所以在这段代码中,我们将数组用于3个确定的主题。我们使用scanner类来输入用户的信息。假设将来我想再增加几个主题。因此,再次编码并不能使它变得灵活。 所以我读到我们可以使用arrayList,我如何使用扫描仪类与arrayList类似这段代码。

  • 我正在编写一个方法,旨在递归地搜索嵌套集合中的值并返回包含该值的集合: 这很好,但当我使用该方法时,如果不先将返回的可选项赋给如下变量,我就无法直接处理它: 在这种情况下,编译器无法知道方法的返回类型。我不知道有什么好的可能使它生效。 我想出了另外两种方法,也不是很好: > 但我不喜欢这样,因为额外的参数(实际上)是不必要的,并且使方法不容易理解。 而不是可选,我只返回集合对象。但在这种情况下,我

  • 支持可用性集(理论上)的一个论点是,它们比区域更接近,因为前者在数据中心内。 我们在GCP和AWS中是否有接近“可用性集”的东西。请分享你的想法。

  • 问题内容: 我试图更改HTML表单,输入类型文件。这是我的代码: HTML,表格ID =表格 .CSS 这两种方法均无效。我确实从某些网站(如Facebook,YouTube,Google或Twitter)看到,它们具有不同的风格。想知道他们是如何做到的。 问题答案: 您不能对输入类型的文件执行任何操作(巨大的黑客攻击除外)。我知道这听起来很可怕,但是Web标准仍然没有提出解决方案。 但是我建议您