2015-08-07 4 views
0

У меня есть сервис Resteasy я хотел бы проверить на работающем сервере (в данном случае я не хочу использовать макет рамки из Resteasy.Mocking классы против сервера работает Resteasy

Однако, я хотел бы для проверки службы без необходимости создания «реальных» данных, поэтому я хотел бы издеваться над некоторыми из классов, которые возвращают данные в службу. Я в основном хочу проверить наличие службы и проверить uri.

Проблема в том, что я возвращаю 404 в случаях, когда данные не существуют и не имеют никакого способа проверить дифференциацию 404 недействительного uri или 404 из идентификатора, который не найден. Мои 404 не являются возвращение любого данные. Например, оба из них даст тот же результат вызывающей стороне:

  • http://validuri/123 (не идентификатор не найден, так 404 - никакие данные не возвращаются)
  • http://invaliduri/123 (не зарегистрирован URI так 404 - никакие данные не возвращаются)

Поэтому я хочу высмеять мой метод getObject (String id), чтобы вернуть мне действительный объект и перейти дальше.

Я могу использовать mocks, если я вызываю класс сервиса напрямую, однако, если я вызываю службу через HTTP-вызов, mocks не привыкают (вместо этого используются «настоящие» классы).

Например, что-то вроде как это (используя JMockit) ...

@Test 
public void someTestMethod(@Mocked final DependencyAbc abc) 
{ 
    // mock will get called in this case 
    // doSomething uses DependencyAbc 
    new RestClass().doSomething(); 
    ... 

    // "real DependencyAbc" gets called, not the mock. 
    response = httpClient.get("http://validuri/123"); 
} 

Resteasy класс я пытаюсь тест:

@GET 
@Path("/validuri/{id}") 
public Response doSomething(@PathParm("id") String id) { 
    ... 
    myObject = dependencyAbc.getObject(id); 
    ... 
    if (myObject == null) { 
     //return 404 
    } 
} 

У меня есть несколько других вариантов я могу использовать например, использовать фальшивую структуру resteasy или вернуть некоторые данные с 404 (в настоящее время данные не возвращаются). Однако я хотел бы понять, почему издевательства не вызываются через HTTP-вызовы, и есть ли способ заставить называть насмешки?

+0

Не так ли, что при вызове 'httpClient.get (...)' выполняется фактическая служба на запущенном сервере? Если это так, то он будет использовать unmocked 'DependencyAbc', поскольку все издевательства происходят только внутри JVM клиента. –

ответ

0

Вы можете создать интерфейс для объекта, который хотите высмеять, содержащий методы, которые вы хотите выполнить.

public interface Dependency { 
    public Object getObject(String id); 
} 

Затем вы можете сделать класс для использования в вашем REST API, который реализует этот интерфейс в вашем mainspace

public class DependencyAbc implements dependency { 
    @Override 
    public Object getObject(String id) { 
     //...return object 
    } 
} 

Затем в остальных API, впрыснуть интерфейс с использованием CDI и реализация будет закачиваться полиморфно

@Inject 
Dependency dependency 

@GET 
@Path("/validuri/{id}") 
public Response doSomething(@PathParm("id") String id) { 
    ... 
    myObject = dependency.getObject(id); 
    ... 
    if (myObject == null) { 
     //return 404 
    } 
} 

Тогда в ваших тестах вы можете создать свой макет зависимость, которая реализует интерфейс, как перед

public class MockDependency implements Dependency { 
    @Override 
    public Object getObject(String id) { 
     //return good object 
    } 
} 

Только теперь, когда вы строите развертывание с помощью термоусадочной пленки, используйте addClass, чтобы добавить MockDependency, а не реальную реализацию Dependency. MockDependency будет вводиться полиморфно.

Смежные вопросы