首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mockserver无法匹配接收到的消息的期望

Mockserver无法匹配接收到的消息的期望
EN

Stack Overflow用户
提问于 2021-12-16 09:56:30
回答 1查看 2.1K关注 0票数 1

我在用

代码语言:javascript
复制
<dependency>
    <groupId>org.mock-server</groupId>
    <artifactId>mockserver-netty</artifactId>
    <version>5.11.2</version>
    <scope>test</scope>
</dependency>

用于REST的集成测试。我从非常基本的期望开始,在测试通过后,进一步错误地进行测试。令我惊讶的是,MockServer一直告诉我,没有收到的请求符合我的期望。

我正在使用Java编写使用MockitoPowerMock来处理静态方法的测试。TestNG是测试Freamework。

这是我的密码:

代码语言:javascript
复制
@PowerMockIgnore({"javax.xml.parsers.*", "org.apache.logging.log4j.*", "com.sun.org.apache.*", "sun.security.*", "javax.net.ssl.*"})
@PrepareForTest({K8sTarget.class, K8sApi.class})

public class DataAccessImplTest extends PowerMockTestCase {

    private static final String HTTP_METHOD_GET = "GET";

    private static final String USER_ID= "46756123123";

    private static final String USERS_PATH = "/api/v1/users/%s";

    private static final String CONTENT_TYPE_APP_JSON = "application/json";

    @Mock
    Target mockTarget;

    @Mock
    K8sClient mockK8sClient;

    private DataAccessFactory dataAccessFactory;

    private DataAccessImpl dataAccessUT;

    private MockServerClient mockServer;

    AutoCloseable closeable;

    @BeforeClass
    public void setup() {

        // ensure all connection using HTTPS will use the SSL context defined by
        // MockServer to allow dynamically generated certificates to be accepted
        HttpsURLConnection.setDefaultSSLSocketFactory(
                new KeyStoreFactory(new MockServerLogger()).sslContext().getSocketFactory());
        this.mockServer = startClientAndServer(PortFactory.findFreePort());

        this.closeable = MockitoAnnotations.openMocks(this);

        dataAccessFactory = DataAccessFactory.getInstance();
        assertNotNull(dataAccessFactory);

        PowerMockito.mockStatic(K8sApi.class);
        PowerMockito.mockStatic(K8sTarget.class);
        PowerMockito.when(K8sApi.getK8sClient()).thenReturn(mockK8sClient);
        PowerMockito.when(K8sTarget.of(Mockito.any(K8sClient.class), Mockito.any(Target.class))).thenReturn(mockTarget);
        Mockito.when(mockTarget.getName()).thenReturn("localhost");
        Mockito.when(mockTarget.getPort()).thenReturn(this.mockServer.getPort().intValue());
        
        dataAccessUT = dataAccessFactory.createDataClient();
    }

    @BeforeMethod
    public void prepareMocks() {

        Mockito.when(mockTarget.getName()).thenReturn("localhost");
        Mockito.when(mockTarget.getPort()).thenReturn(this.mockServer.getPort().intValue());
    }

    @AfterClass
    public void teardown() throws Exception {
        this.closeable.close();
        this.mockServer.stop();
    }

    @Test
    public void getUserTest_200_Ok() throws IOException {

        dataAccessUT.getUserData(USER_ID);

        mockServer.when(request()
                .withMethod(HTTP_METHOD_GET)
                .withPath(String.format(USERS_PATH, USER_ID))
        )
        .respond(
            response()
                .withStatusCode(HttpStatusCode.OK_200.code())
                .withHeader(HttpHeaderNames.CONTENT_TYPE.toString(), CONTENT_TYPE_APP_JSON)
                .withBody("some_response_body")
        );
    }
}

这些是控制台日志:

代码语言:javascript
复制
10:06:24.067 [nioEventLoopGroup-2-1] DEBUG com.commonlibrary.httpclient.common.HttpConnectionListener:28 - 0.1 HttpConnectionListener::operationComplete: connected to [localhost:58136] from [/127.0.0.1:58204]
10:06:24.285 [MockServer-EventLog0] INFO  org.mockserver.log.MockServerEventLog:108 - 58136 received request:

  {
    "method" : "GET",
    "path" : "/api/v1/users/46756123123",
    "headers" : {
      "authorization" : [ "Bearer token" ],
      "accept" : [ "application/json" ],
      "host" : [ "localhost:58136" ],
      "content-length" : [ "0" ]
    },
    "keepAlive" : true,
    "secure" : false
  }

10:06:24.350 [MockServer-EventLog0] INFO  org.mockserver.log.MockServerEventLog:108 - 58136 no expectation for:

  {
    "method" : "GET",
    "path" : "/api/v1/users/46756123123",
    "headers" : {
      "authorization" : [ "Bearer token" ],
      "accept" : [ "application/json" ],
      "host" : [ "localhost:58136" ],
      "content-length" : [ "0" ]
    },
    "keepAlive" : true,
    "secure" : false
  }

 returning response:

  {
    "statusCode" : 404,
    "reasonPhrase" : "Not Found"
  }

10:06:24.483 [MockServer-EventLog0] INFO  org.mockserver.log.MockServerEventLog:108 - 58136 stopped for port: 58136

正如您所看到的(除非我遗漏了什么)请求应该与期望相匹配,但它不是‘。我试过几件事,但都没有成功:

  • 将请求期望降低到最低限度,只需调用请求(),而不定义任何其他内容。这应该符合每一个收到的请求。相同的result.
  • introduce Times.exactly(1)在期望中。与我在请求中发送的头部相同,尽管我的理解是,如果它们不是按预期设置的,则它们不用于匹配。同样的结果.

两天后,我的想法用完了,所以任何帮助或暗示都将不胜感激。谢谢!

在MockServer站点中遵循提示和检查代码示例后进行编辑

按照@peter-rowth的建议,我移动了在创建期望之后发送的请求,它起了作用。我正在编辑这个问题,也是为了明确它复制了我后来发现的https://stackoverflow.com/questions/63843619/mockserver-request-not-found,。

EN

回答 1

Stack Overflow用户

发布于 2021-12-20 16:46:33

在您的测试中,您是在执行对测试中代码的调用之后在MockServer中创建期望的吗?来自MockServer的控制台输出不输出匹配/不匹配的期望(默认行为)这一事实向我表明,在向MockServer发出web请求时没有设置期望,而当没有对请求的期望时,MockServer的默认响应是404。

尝试将该期望添加为测试的第一行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70377004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档