### Question:
MetadataService extends AbstractService { public <T extends Queryable> T getObj(Project project, Class<T> cls, Restriction... restrictions) { final Collection<String> results = findUris(project, cls, restrictions); if (results == null || results.isEmpty()) { throw new ObjNotFoundException(cls); } else if (results.size() != 1) { throw new NonUniqueObjException(cls, results); } return getObjByUri(results.iterator().next(), cls); } MetadataService(final RestTemplate restTemplate, final GoodDataSettings settings); @SuppressWarnings("unchecked") T createObj(Project project, T obj); T getObjByUri(String uri, Class<T> cls); Collection<Obj> getObjsByUris(Project project, Collection<String> uris); @SuppressWarnings("unchecked") T updateObj(T obj); void removeObj(Obj obj); void removeObjByUri(String uri); T getObjById(Project project, String id, Class<T> cls); String getObjUri(Project project, Class<T> cls, Restriction... restrictions); T getObj(Project project, Class<T> cls, Restriction... restrictions); Collection<Entry> find(Project project, Class<T> cls, Restriction... restrictions); Collection<String> findUris(Project project,
                                                             Class<T> cls,
                                                             Restriction... restrictions); @SuppressWarnings("unchecked") Collection<Entry> usedBy(Project project, Obj obj, boolean nearest, Class<? extends Obj>... types); @SuppressWarnings("unchecked") Collection<Entry> usedBy(Project project, String uri, boolean nearest, Class<? extends Obj>... types); @SuppressWarnings("unchecked") Collection<Usage> usedBy(Project project, Collection<String> uris, boolean nearest, Class<? extends Obj>... types); Collection<String> findUris(Project project, Restriction... restrictions); Map<String, String> identifiersToUris(Project project, Collection<String> identifiers); List<AttributeElement> getAttributeElements(Attribute attribute); List<AttributeElement> getAttributeElements(DisplayForm displayForm); static final UriTemplate OBJ_TEMPLATE; }### Answer:
@Test public void testGetObjToFindOneObjById() { final Queryable intendedResult = mock(Queryable.class); final Query queryResult = mock(Query.class); final Entry resultEntry = mock(Entry.class); final String uri = "myURI"; final String id = "myId"; when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult); when(queryResult.getEntries()).thenReturn(asList(resultEntry)); when(resultEntry.getIdentifier()).thenReturn(id); when(resultEntry.getUri()).thenReturn(uri); when(restTemplate.getForObject(uri, Queryable.class)).thenReturn(intendedResult); final Queryable result = service.getObj(project, Queryable.class, Restriction.identifier(id)); assertThat(result, is(intendedResult)); }
@Test(expectedExceptions = NonUniqueObjException.class) public void testGetObjMoreThanOneResult() { final Query queryResult = mock(Query.class); final Entry resultEntry1 = mock(Entry.class); final Entry resultEntry2 = mock(Entry.class); when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult); when(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2)); service.getObj(project, Queryable.class); }
@Test(expectedExceptions = ObjNotFoundException.class) public void testGetObjNothingFound() { final Query queryResult = mock(Query.class); final Entry resultEntry = mock(Entry.class); final String title = "myTitle"; when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult); when(queryResult.getEntries()).thenReturn(asList(resultEntry)); service.getObj(project, Queryable.class, Restriction.title(title)); }