public void createTopicList(final String address, final List<TopicConfig> topicConfigList, final long timeoutMillis)
        throws InterruptedException, RemotingException, MQClientException {
        CreateTopicListRequestHeader requestHeader = new CreateTopicListRequestHeader();
        CreateTopicListRequestBody requestBody = new CreateTopicListRequestBody(topicConfigList);

        RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.UPDATE_AND_CREATE_TOPIC_LIST, requestHeader);
        request.setBody(requestBody.encode());

        RemotingCommand response = this.remotingClient.invokeSync(
            MixAll.brokerVIPChannel(this.clientConfig.isVipChannelEnabled(), address), request, timeoutMillis);
        assert response != null;
        if (response.getCode() == ResponseCode.SUCCESS) {
            return;
        }

        throw new MQClientException(response.getCode(), response.getRemark());
    }
@Test
    public void testCreateTopicList_Success() throws RemotingException, InterruptedException, MQClientException {
        doAnswer((Answer<RemotingCommand>) mock -> {
            RemotingCommand request = mock.getArgument(1);

            RemotingCommand response = RemotingCommand.createResponseCommand(null);
            response.setCode(ResponseCode.SUCCESS);
            response.setOpaque(request.getOpaque());
            return response;
        }).when(remotingClient).invokeSync(anyString(), any(RemotingCommand.class), anyLong());

        final List<TopicConfig> topicConfigList = new LinkedList<>();
        for (int i = 0; i < 16; i++) {
            TopicConfig topicConfig = new TopicConfig();
            topicConfig.setTopicName("Topic" + i);
            topicConfigList.add(topicConfig);
        }

        mqClientAPI.createTopicList(brokerAddr, topicConfigList, 10000);
    }