RaigorJiang commented on pull request #14730:
URL: https://github.com/apache/shardingsphere/pull/14730#issuecomment-1033445337


   Hi @Swastyy 
   I copied your test case and found the following problems:
   1. Methods declared by `@Test` should not have parameters
   2. The method `containsTable` belongs to `ShardingSphereSchema` (but not 
`ShardingSphereMetaData`) and can be called by 
`schemaMetaData.getSchema().containsTable(tableName)`
   3. The process of refreshing table metadata needs to read table information 
from the database, so we have to mock this method: `TableMetaDataBuilder.load`
   
   Here is a working example, you can improve the test logic as you want:
   ```java
   mport org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
   import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
   import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationSchemaMetaData;
   import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
   import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
   import 
org.apache.shardingsphere.infra.metadata.schema.builder.TableMetaDataBuilder;
   import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
   import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
   import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
   import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
   import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
   import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.ddl.MySQLCreateTableStatement;
   import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateTableStatement;
   import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl.PostgreSQLCreateTableStatement;
   import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sql92.ddl.SQL92CreateTableStatement;
   import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerCreateTableStatement;
   import org.junit.Test;
   import org.mockito.MockedStatic;
   
   import java.sql.SQLException;
   import java.util.Collections;
   import java.util.HashMap;
   import java.util.LinkedHashMap;
   import java.util.Map;
   
   import static org.junit.Assert.assertTrue;
   import static org.mockito.ArgumentMatchers.any;
   import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
   import static org.mockito.Mockito.mock;
   import static org.mockito.Mockito.mockStatic;
   import static org.mockito.Mockito.when;
   
   public final class CreateTableStatementSchemaRefresherTest {
       
       @Test
       public void refreshForMySQL() throws SQLException {
           MySQLCreateTableStatement createTableStatement = new 
MySQLCreateTableStatement();
           createTableStatement.setContainsNotExistClause(false);
           refresh(createTableStatement);
       }
       
       @Test
       public void refreshForOracle() throws SQLException {
           OracleCreateTableStatement createTableStatement = new 
OracleCreateTableStatement();
           refresh(createTableStatement);
       }
       
       @Test
       public void refreshForPostgreSQL() throws SQLException {
           PostgreSQLCreateTableStatement createTableStatement = new 
PostgreSQLCreateTableStatement();
           createTableStatement.setContainsNotExistClause(false);
           refresh(createTableStatement);
       }
       
       @Test
       public void refreshForSQL92() throws SQLException {
           SQL92CreateTableStatement createTableStatement = new 
SQL92CreateTableStatement();
           refresh(createTableStatement);
       }
       
       @Test
       public void refreshForSQLServer() throws SQLException {
           SQLServerCreateTableStatement createTableStatement = new 
SQLServerCreateTableStatement();
           refresh(createTableStatement);
       }
       
       private void refresh(final CreateTableStatement sqlStatement) throws 
SQLException {
           String tableName = "t_order_0";
           String schemaName = "sharding_db";
           sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(1, 
3, new IdentifierValue(tableName))));
           ShardingSphereMetaData schemaMetaData = 
mock(ShardingSphereMetaData.class, RETURNS_DEEP_STUBS);
           ShardingSphereSchema shardingSphereSchema = new 
ShardingSphereSchema(getTableMetaDataMap(tableName));
           when(schemaMetaData.getSchema()).thenReturn(shardingSphereSchema);
           FederationSchemaMetaData federationSchemaMetaData = 
mock(FederationSchemaMetaData.class);
           when(federationSchemaMetaData.getName()).thenReturn(schemaName);
           MetaDataRefresher<CreateTableStatement> schemaRefresher = new 
CreateTableStatementSchemaRefresher();
           try(MockedStatic<TableMetaDataBuilder> tableMetaDataBuilder = 
mockStatic(TableMetaDataBuilder.class)) {
               tableMetaDataBuilder.when(() -> TableMetaDataBuilder.load(any(), 
any())).thenReturn(getTableMetaDataMap(tableName));
               schemaRefresher.refresh(schemaMetaData, 
federationSchemaMetaData, new HashMap<>(), Collections.emptyList(), 
sqlStatement, mock(ConfigurationProperties.class));
               assertTrue(shardingSphereSchema.containsTable(tableName));
           }
       }
       
       private Map<String, TableMetaData> getTableMetaDataMap(final String 
tableName) {
           Map<String, TableMetaData> result = new LinkedHashMap<>();
           result.put(tableName, mock(TableMetaData.class));
           return result;
       }
   }
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to