abstract void execute(Admin admin, Namespace ns, PrintStream out) throws Exception;
@Test
    public void testFindHangingSpecifiedTopicPartition() throws Exception {
        TopicPartition topicPartition = new TopicPartition("foo", 5);

        String[] args = new String[]{
            "--bootstrap-server",
            "localhost:9092",
            "find-hanging",
            "--topic",
            topicPartition.topic(),
            "--partition",
            String.valueOf(topicPartition.partition())
        };

        long producerId = 132L;
        short producerEpoch = 5;
        long lastTimestamp = time.milliseconds();
        OptionalInt coordinatorEpoch = OptionalInt.of(19);
        OptionalLong txnStartOffset = OptionalLong.of(29384L);

        expectDescribeProducers(
            topicPartition,
            producerId,
            producerEpoch,
            lastTimestamp,
            coordinatorEpoch,
            txnStartOffset
        );

        execute(args);
        assertNormalExit();

        List<List<String>> table = readOutputAsTable();
        assertEquals(1, table.size());

        List<String> expectedHeaders = TransactionsCommand.FindHangingTransactionsCommand.HEADERS;
        assertEquals(expectedHeaders, table.get(0));
    }