2017-04-10 16 views
2

我试图使用Wiremock来拦截在ApplicationReadyEvent上触发的HTTP调用。问题在于,此调用是在应用Wiremock规则之前完成的。所以这个API没有被嘲笑。如何模拟在ApplicationReadyEvent上触发的HTTP调用

参见下面的示例

public class OnApplicationReadyListener implements ApplicationListener<ApplicationReadyEvent>{ 

@Override 
public void onApplicationEvent(ApplicationReadyEvent event) { 
    // in this pathe is being send a request 
    consulHealthCheckService.register(); 
} 

}

的磕碰在@Before相位,这实际上是触发一次Servlet容器是准备进行配置。因此,实际上 - HTTP调用被激发

@RunWith(SpringRunner.class) 
    @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = ConsulApplication.class) 
    public class ConsulApplicationTest { 

     @Rule 
     public WireMockRule wireMockRule = new WireMockRule(Agent.DEFAULT_PORT); 

     @Before 
     public void setup(){ 
      // is being executed after the http call was fired 
stubFor(get(anyUrl()).willReturn(aResponse().withStatus(HttpStatus.OK.value()))); 
      stubFor(put(urlEqualTo("/agent/service/register")) 
        .willReturn(aResponse() 
          .withStatus(HttpStatus.OK.value()) 
          .withHeader("Content-Type", APPLICATION_JSON_VALUE) 
          )); 
     } 

     @Test 
     public void shouldRegisterServiceOnApplicationStartup(){ 

      verify(putRequestedFor(urlEqualTo("/agent/service/register"))); 


     } 
    } 

有什么办法如何存根给定的HTTP调用之后?请注意:Iam不能模拟实际触发呼叫的服务代码。

回答

0

而不是使用WireMockRule,您可以静态创建一个WireMockServer在端口上启动它,甚至在此测试类完全初始化之前加载映射。如果这确实起作用,则可以确保服务器在@AfterClass方法中关闭。

如果你尝试这样做,并且在你的测试类被初始化之前仍然发出请求,那么你必须弄清楚何时/何地发出了请求,并找到另一种方法来测试你的断言,因为它在测试类甚至被初始化。