2016-04-24 3 views
0

Привет вот мой метод испытания:Как издеваются статический метод API

public String getRequestBuilder(String foo1) { 
    RequestBuilder RequestBuilder = ClientRequest.authorizationProvider(AuthProviderType.footype); 
    String locationURI = someclassmethod.getLocationURI(RequestBuilder, foo, foo1); 
    return locationURI; 
} 

Вот мой тест:

@Test 
public void test_foo() { 
    when(someotherclass.getLocationURI(Matchers.eq(mockRequestBuilder), Matchers.eq("foo"), 
    Matchers.eq("foo1"))).thenReturn("locationURI"); 
    assertEquals("locationURI", Properties.getRequestBuilder("foo1")); 
} 

В методе

RequestBuilder RequestBuilder = ClientRequest.authorizationProvider(AuthProviderType.foo); 

является статический метод, предоставляемый API. Я не хочу использовать PowerMockito для этого. Если я использую

Matchers.any() 

вместо

Matchers.eq(mockRequestBuilder) 

тестовый пример проходит. Но использование Matchers.any не предоставило бы мне точного значения. Есть ли способ работать в этом случае? Foo - это значение, которое мы возвращаем из другого метода класса.

+0

Имеет ли этот API какой-либо способ настроить то, что именно возвращается 'authorizationProvider'? Возможно, свойство конфигурации или механизм впрыска зависимостей. –

ответ

0

Вы все еще можете проверить пройденное значение, используя ArgumentCaptor.

@Test 
public void test_foo() { 
    ArgumentCaptor<RequestBuilder> reqCaptor = ArgumentCaptor.forClass(RequestBuilder.class); 
    when(someotherclass.getLocationURI(any(RequestBuilder.class), anyString(), anyString())).thenReturn("locationURI"); 
    assertEquals("locationURI", Properties.getRequestBuilder("foo1")); 
    verify(someotherclass).getLocationURI(reqCaptor.capture(), "foo1", "foo2"); 
    //Here you can check that reqCaptor.getValue() is equals to expected RequestBuilder and fail the test if not. 
} 

В этом случае вам не нужно использовать PowerMock для издевательства статического метода.

+0

при проверке фактического значения аргумента RequestBuilder аргументCaptor, должен ли я вызвать: someotherclass.getLocationURI (Matchers.any (RequestBuilder.class), Matchers.eq ("foo"), Matchers.eq ("foo1")) ;? передавая значение для Matchers.any (RequestBuilder.class) – Jasmine

+0

Я предполагаю, что вы хотите протестировать метод getRequestBuilder(). Итак, 'getLocationURI' должен быть вызван внутри' getRequestBuilder'. Нет необходимости в явном вызове 'getLocationURI'. –

+0

Но RequestBuilder построен с использованием статического метода, а затем отправляется как параметр метода getLocationURI. – Jasmine

0

В качестве альтернативы ArgumentCaptor вы также можете ввести фабрику, которая создает для вас объект RequestBuilder.

Тогда вы можете издеваться над этой фабрикой; и что еще более важно: тот факт, что вам нужно вызвать некоторый статический метод для какого-то другого класса ..., скрыт на этой фабрике; и не вызывает проблем для других частей вашего кода.

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