Code review comment: catching up on the discussions.  I am not sure the `VaultTransitKeyDetail` is bringing a lot of value with the 2 subclasses. or at the very least the abstract superclass should introduce field `Map<String, T> versions`, with `VaultTransitKeyDetail` being parameterized with `T extends VaultTransitKeyDetail`. then subclasses should defined `T` consistently: `VaultTransitSymmetricKeyVersion` for `VaultTransitSymmetricKeyDetail`, and `VaultTransitAsymmetricKeyVersion` for `VaultTransitAsymmetricKeyDetail`.  the other option is to keep a single class `VaultTransitKeyDetail` like before , and add field `Map<String, ? extends VaultTransitKeyVersion> versions`. I have a slight preference for that solution, since after you do work described just above, you will end up with empty `VaultTransitSymmetricKeyDetail` and `VaultTransitAsymmetricKeyDetail` classes, serving essentially as markers to get the appropriate parametrized types for the `versions` map.  what do you all think?

Code under review:
public void symmetricReadAESKey() {

        assertFalse(transitSecretEngine.listKeys().contains(KEY_NAME));
        transitSecretEngine.createKey(KEY_NAME, new KeyCreationRequestDetail().setType("aes256-gcm96"));
        assertTrue(transitSecretEngine.listKeys().contains(KEY_NAME));

        VaultTransitKeyDetail mykey = transitSecretEngine.readKey(KEY_NAME);
        assertTrue(mykey instanceof VaultTransitSymmetricKeyDetail);
        assertEquals(KEY_NAME, mykey.getName());
        assertFalse(mykey.isExportable());
        assertFalse(mykey.isDeletionAllowed());
        assertTrue(mykey.isSupportsDecryption());
        assertTrue(mykey.isSupportsEncryption());
        assertTrue(mykey.isSupportsDerivation());
        assertFalse(mykey.isSupportsSigning());
        assertEquals(mykey.getType(), "aes256-gcm96");
        assertEquals(1, mykey.getKeys().size());
        assertTrue(mykey.getKeys().containsKey("1"));
        assertEquals(1, mykey.getVersions().size());
        assertTrue(mykey.getVersions().containsKey("1"));
        assertNotNull(mykey.getVersions().get("1").getCreationTime());
        assertTrue(mykey.getVersions().get("1") instanceof VaultTransitSymmetricKeyVersion);
        assertEquals(1, mykey.getLatestVersion());
        assertEquals(0, mykey.getMinAvailableVersion());
        assertEquals(1, mykey.getMinDecryptionVersion());
        assertEquals(0, mykey.getMinEncryptionVersion());

        transitSecretEngine.updateKeyConfiguration(KEY_NAME, new KeyConfigRequestDetail().setDeletionAllowed(true));
        mykey = transitSecretEngine.readKey(KEY_NAME);
        assertTrue(mykey.isDeletionAllowed());

        transitSecretEngine.deleteKey(KEY_NAME);
        assertNull(transitSecretEngine.readKey(KEY_NAME));
    }

Line commented on: assertEquals(mykey.getType(), "aes256-gcm96");

Revised code:
public void symmetricReadAESKey() {

        assertFalse(transitSecretEngine.listKeys().contains(KEY_NAME));
        transitSecretEngine.createKey(KEY_NAME, new KeyCreationRequestDetail().setType("aes256-gcm96"));
        assertTrue(transitSecretEngine.listKeys().contains(KEY_NAME));

        VaultTransitKeyDetail<?> mykey = transitSecretEngine.readKey(KEY_NAME);
        assertTrue(mykey instanceof VaultTransitSymmetricKeyDetail);
        assertEquals(KEY_NAME, mykey.getName());
        assertFalse(mykey.isExportable());
        assertFalse(mykey.isDeletionAllowed());
        assertTrue(mykey.isSupportsDecryption());
        assertTrue(mykey.isSupportsEncryption());
        assertTrue(mykey.isSupportsDerivation());
        assertFalse(mykey.isSupportsSigning());
        assertEquals(mykey.getType(), "aes256-gcm96");
        assertEquals(1, mykey.getKeys().size());
        assertTrue(mykey.getKeys().containsKey("1"));
        assertEquals(1, mykey.getVersions().size());
        assertTrue(mykey.getVersions().containsKey("1"));
        assertNotNull(mykey.getVersions().get("1").getCreationTime());
        assertTrue(mykey.getVersions().get("1") instanceof VaultTransitSymmetricKeyVersion);
        assertEquals(1, mykey.getLatestVersion());
        assertEquals(0, mykey.getMinAvailableVersion());
        assertEquals(1, mykey.getMinDecryptionVersion());
        assertEquals(0, mykey.getMinEncryptionVersion());

        transitSecretEngine.updateKeyConfiguration(KEY_NAME, new KeyConfigRequestDetail().setDeletionAllowed(true));
        mykey = transitSecretEngine.readKey(KEY_NAME);
        assertTrue(mykey.isDeletionAllowed());

        transitSecretEngine.deleteKey(KEY_NAME);
        assertNull(transitSecretEngine.readKey(KEY_NAME));
    }