将请求重定向到 Side_Effect Utility 类

Re-direct requests to SideEffect Utility Classes

下面需要测试的spring启动应用程序是我的查询。

@CustomLog
@RestController
@RequestMapping("/my_path")
public class MyController {
    @GetMapping(path = "**", produces = {MediaType.APPLICATION_JSON_VALUE})
    public ResponseEntity<JsonNode> fetchData(HttpServletRequest request){
      ... some code.....which also calls external apis.....
      }
    @PostMapping(path = "**", produces = {MediaType.APPLICATION_JSON_VALUE})
    @ResponseBody
    public ResponseEntity<Map<String, Object>> createMOI(HttpServletRequest request){
          ... some code.....which also calls external apis.....
      }
    }

我的应用程序调用了一个外部服务,现在需要对其进行模拟。

this.webClient = WebClient.builder().baseUrl("http://localhost:9600/external_host_path")
                .defaultHeader(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_JSON_VALUE)
                .build();
Mono<Pojo>responseMo = webClient.post().uri("/aGivenSubPath")
                       .accept(MediaType.APPLICATION_JSON).bodyValue(requestPoJo)
                       .retrieve().bodyToMono(Pojo.class).block();

我正在使用 MVC 调用我的控制器 API 作为 springtest

的一部分
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyControllerTest {
  @Autowired
  MyController controller;
  @Before
  public void setup() throws Exception {
    this.mockMvc = standaloneSetup(this.controller).build();
  }
  @Test
  public void testControl() throws Exception {
    mockMvc
    .perform(post("http://localhost:9600/my_path")
    .contentType(MediaType.APPLICATION_JSON)
    .content("{'someData':'[]'}"))
    .andExpect(status().isAccepted())
  .andReturn();
  }
}

我正在寻找的是某种代理或副作用

http://localhost:9600/external_host_path

并将为此主机进行的所有调用重定向到自定义实用程序 class,该实用程序根据请求参数以编程方式向外部主机提供响应。

我见过 mockito、wireMock、mockwebserver、mockserver 等的多个示例 但是它们中的大多数都在给定的(静态路径)-当(调用静态路径)-然后(给出静态响应)上工作。 在整个流程中我有很多调用,我已经有了实用程序的逻辑 class 来为提供的请求参数生成响应。

虽然我找不到将网络服务器请求重定向到 sideEffect 的答案 class, 现在至少由 Mockito 的 MockBean 和 Answer 管理。

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyControllerTest {
  @Autowired
  MyController controller;
  @MockBean
  MyExternalServiceClient serviceClient;
  @Autowired
  MySideEffectService sideEffect;
  @Before
  public void setup() throws Exception {
    this.mockMvc = standaloneSetup(this.controller).build();     
    Mockito.when(serviceClient.getMethod(any(),anyBoolean())).thenAnswer((Answer) invocation -> {
        Object[] args = invocation.getArguments();
        Object mock = invocation.getMock();
        return sideEffect.getMethod((Map<String, List<String>>) args[0], (Boolean) args[1]);
    });
  }
  @Test
  public void testControl() throws Exception {
    mockMvc
    .perform(post("http://localhost:9600/my_path")
    .contentType(MediaType.APPLICATION_JSON)
    .content("{'someData':'[]'}"))
    .andExpect(status().isAccepted())
  .andReturn();
  }
}

仍然会寻找一种方法(也许可以动态创建图像的 TestContainers 将使用我的 mockCode 创建一个服务器,这样我就可以使用这个主机名并替换为现有的真实主机名)