### Question:
MetaverseTransientNode extends PropertiesHolder implements IMetaverseNode, IIdentifierModifiable { @Override public String getLogicalId() { if ( logicalIdGenerator == null ) { return getStringID(); } else if ( logicalId == null || isDirty() ) { logicalId = logicalIdGenerator.generateId( this ); } return logicalId == null ? getStringID() : logicalId; } MetaverseTransientNode();  MetaverseTransientNode( String id ); @Override String getName(); @Override String getStringID(); @Override String getType(); @Override void setName( String name ); @Override void setStringID( String id ); @Override void setType( String type ); void addLink( IMetaverseLink link ); void removeLink( IMetaverseLink link ); List<IMetaverseLink> getLinks(); @Override String getLogicalId(); @Override void setLogicalIdGenerator( ILogicalIdGenerator idGenerator );  }### Answer:
@Test public void testGetLogicalId() throws Exception { MetaverseTransientNode myNode = new MetaverseTransientNode(); myNode.setName( "testName" ); myNode.setType( "testType" ); myNode.setProperty( "zzz", "last" ); myNode.setProperty( DictionaryConst.PROPERTY_NAMESPACE, "" ); myNode.setStringID( "myId" ); assertEquals( "{\"name\":\"testName\",\"namespace\":\"\",\"type\":\"testType\"}", myNode.getLogicalId() ); ILogicalIdGenerator idGenerator = new MetaverseLogicalIdGenerator( "type", "zzz", "name" ); myNode.setLogicalIdGenerator( idGenerator ); assertNotNull( myNode.logicalIdGenerator ); assertEquals( "{\"name\":\"testName\",\"type\":\"testType\",\"zzz\":\"last\"}", myNode.getLogicalId() ); }