protected String getRowKey(String resourceId, String tableName, String pk) {
        return new StringBuilder().append(resourceId).append(LOCK_SPLIT).append(tableName).append(LOCK_SPLIT).append(pk)
            .toString();
    }
@Test
    public void testGetRowKey() {
        AbstractLocker locker = new AbstractLocker() {
            @Override
            public boolean acquireLock(List<RowLock> rowLock) {
                return false;
            }

            @Override
            public boolean acquireLock(List<RowLock> rowLock, boolean autoCommit, boolean skipCheckLock) {
                return false;
            }

            @Override
            public boolean releaseLock(List<RowLock> rowLock) {
                return false;
            }

            @Override
            public boolean isLockable(List<RowLock> rowLock) {
                return false;
            }

            @Override
            public void updateLockStatus(String xid, LockStatus lockStatus) {

            }
        };

        // Call the getRowKey method
        String rowKey = locker.getRowKey("resource1", "table1", "123");

        // Assert that the row key is constructed correctly
        Assertions.assertEquals("resource1^^^table1^^^123", rowKey);
    }