### Question:
DescribeOp extends AbstractGeoGigOp<Optional<Map<String, String>>> { public static Optional<Map<String, String>> describe(DataStore dataStore, String table) { if (dataStore == null) { throw new GeoToolsOpException(StatusCode.DATASTORE_NOT_DEFINED); } if (table == null || table.isEmpty()) { throw new GeoToolsOpException(StatusCode.TABLE_NOT_DEFINED); } Map<String, String> propertyMap = new HashMap<String, String>(); boolean foundTable = false; List<org.opengis.feature.type.Name> typeNames; try { typeNames = dataStore.getNames(); } catch (Exception e) { throw new GeoToolsOpException(StatusCode.UNABLE_TO_GET_NAMES); } for (org.opengis.feature.type.Name typeName : typeNames) { if (!table.equals(typeName.toString())) continue; foundTable = true; SimpleFeatureSource featureSource; try { featureSource = dataStore.getFeatureSource(typeName); } catch (Exception e) { throw new GeoToolsOpException(StatusCode.UNABLE_TO_GET_FEATURES); } SimpleFeatureType featureType = featureSource.getSchema(); for (org.opengis.feature.type.PropertyDescriptor descriptor : featureType .getDescriptors()) { propertyMap.put(descriptor.getName().toString(), descriptor.getType().getBinding().getSimpleName()); } } if (!foundTable) { return Optional.empty(); } return Optional.of(propertyMap); }  static Optional<Map<String, String>> describe(DataStore dataStore, String table); DescribeOp setTable(String table); DescribeOp setDataStore(DataStore dataStore);  }### Answer:
@Test public void testDescribe() throws Exception { DescribeOp describe = new DescribeOp(); describe.setDataStore( TestHelper.createTestFactory().createDataStore(Collections.emptyMap())); describe.setTable("table1"); Optional<Map<String, String>> properties = describe.call(); assertTrue(properties.isPresent()); assertEquals("Point", properties.get().get("geom")); assertEquals("String", properties.get().get("label")); }