2017-02-16 19 views
1

Я использую Mockito для издевательских служб в моем текущем проекте. У меня есть сценарий, в котором мне нужно высмеять прикованные методы в коде. Привязанный метод использует свободный дизайн. Код выглядит следующим образом. Я не мог найти решение, которое удовлетворяет моему требованию.Мокальные вызовы в цепочке в Java/Mockito

ProcessCall setValue = ProcessCall.url("").http(HttpMethod.GET).contentType(null).reqHeaders(null).payload(null).create(); 

Я пытаюсь издеваться выше код, как показано ниже

@Test 
    public void ProcessPost(){ 
    System.out.println("--------------------------"); 
    ProcessCall procCall= Mockito.mock(ProcessCall.class, Mockito.RETURNS_DEEP_STUBS); 
    Mockito.when(ProcessCall .url("").http(HttpMethod.GET).contentType(null).reqHeaders(null).payload(null).create()).thenReturn(??); 

} 

Не уверен, что пройти в thenReturn (??) method.ProcessCall класс с собственным конструктором. и он имеет метод execute(), который мне нужно выполнить из результата вызова. Я получаю ошибку ниже:

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
    when() requires an argument which has to be 'a method call on a mock'. 
    For example: 
    when(mock.getArticles()).thenReturn(articles); 
Or 'a static method call on a prepared class` 
For example: 
    @PrepareForTest({ StaticService.class }) 
    TestClass{ 
     public void testMethod(){ 
      PowerMockito.mockStatic(StaticService.class); 
     when(StaticService.say()).thenReturn(expected); 
    } 
    } 

    Also, this error might show up because: 
    1. inside when() you don't call method on mock but on some other object. 
    2 . inside when() you don't call static method, but class has not been prepared. 

Может кто-нибудь помочь мне решить эту проблему. Я застрял в этой проблеме и не могу найти правильное решение на SO.

Благодаря

+0

А за «использование powermock для статических вызовов»; также учитывайте «не используя статические вызовы, поэтому не нуждаясь в элементе власти». Если у вас есть выбор, перейдите на вариант 2 здесь; и всегда! – GhostCat

ответ

1

Я думаю, что исключение говорит больше всего о решении .. как вы насмехается статический метод, то рекомендуется использовать PowerMockito (вам нужно будет добавить правильную зависимость), а затем в вас тесте :

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ ProcessCall.class }) 
public class MyTest{ 

    @Test 
    public void ProcessPost(){ 
     System.out.println("--------------------------"); 
     ProcessCall processCallInstance = ProcessCall.getInstance(); 
     ProcessCall procCall= PowerMockito.mockStatic(ProcessCall.class 
       , Mockito.RETURNS_DEEP_STUBS); 
     Mockito.when(ProcessCall .url("").http(HttpMethod.GET) 
        .contentType(null).reqHeaders(null).payload(null).create()) 
       .thenReturn(processCallInstance); 
     ... 
     processCallInstance.execute(); 
     ... 
} 

Как я предполагаю, что ProcessCall одноэлементно вам нужно будет использовать что-то вроде ProcessCall.getInstance();, чтобы получить объект, а затем пометить его как результат глубоких вызовов окурка .., а затем выполнить все, что нужно на нем.

Кроме того

Если вы хотите, чтобы дразнить метод execute(), затем снова вы можете использовать PowerMockito для достижения этой цели:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ ProcessCall.class }) 
public class MyTest{ 

    @Test 
    public void ProcessPost(){ 
     System.out.println("--------------------------"); 
     ProcessCall processCallInstance = PowerMockito.mock(ProcessCall.class); 
+0

спасибо. Но unorntasty power mock не поддерживает вызов статических методов. все еще сталкиваются с одной и той же проблемой, но я ценю вашу помощь. – vikeng21

+0

Попробуйте использовать PowerMockito.doReturn (processCallInstance) .when (ProcessCall) .url (""). Http (HttpMethod.GET) .contentType (null) .reqHeaders (null) .payload (null) .create(); –

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

  • Нет связанных вопросов^_^