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]