2013-07-16 3 views
1

У меня есть совсем другой метод вызова метода, который мне нужно протестировать с использованием платформы тестирования JMockit. Сначала давайте посмотрим на код.Мощный вызов метода с возвратом типа void с использованием JMockit или Mockito

public class MyClass{ 

    MyPort port;  

    public registerMethod(){ 
     Holder<String> status=null; 
     Holder<String> message=null; 

     //below method call is a call to a webservice in the real implementation using apache cxf framework. This method has a void return type. Read below for better explanation. 
     port.registerService("name", "country", "email", status, message); 

     // do some stuff with status and message here..... 

     HashMap response = new HashMap(); 
     response.put(status); 
     response.put(message); 

     return response; 
    } 

} 

Теперь позвольте мне немного пояснить. Этот класс в основном имеет переменную экземпляра порта, которая используется для подключения к веб-сервису. Реализация webservice использует автоматически сгенерированные классы инфраструктуры apache cxf для подключения к веб-сервису и получения ответа. Моя задача - осуществить издевательство над этим вызовом webservice для написания тестовых кодов для многих похожих вызовов, которые есть в реальном приложении.

Проблема здесь: если вы заметили, что вызов веб-службы фактически производится методом port.registerService, посылая имя, страну и адрес электронной почты в качестве параметров. Теперь мы также передаем переменные статуса и сообщения как сами параметры этого метода. Таким образом, этот метод вместо того, чтобы возвращать некоторое значение для статуса и сообщения, имеет значение FILLS IN в этих двух переданных параметрах, которые сильно отличаются от подхода RETURN.

Теперь проблема в том, когда я пытаюсь издеваться над этим вызовом с помощью jmockit, я всегда могу издеваться над этим вызовом, но чего ожидать? поскольку возврата нет вообще, он оказывается недействительным, который заполняет значения в переданных параметрах. Таким образом, я всегда получаю статус, а message - как null, если я издеваюсь над этим вызовом, поскольку не могу выразить ожидаемое ожидание в реализации jmockit.

Пожалуйста, если у кого-нибудь есть какие-либо решения или предложения по вышеуказанной проблеме, ответьте и постарайтесь мне помочь. Благодарю.

+0

Вы можете моделировать поведение издевались 'port.registerService (...) 'с результатом' result = new Delegate() {void delegate (...) {...}}; 'запись в ожидании. Это позволило бы тесту указать желаемые побочные эффекты. Но, не видя полного тестируемого метода, я не могу точно сказать, нужно ли это то, что вам нужно ... –

+0

Проблема в том, что вызов метода только устанавливает значения в переменных в статусе и переменных сообщения без возврата что-нибудь. –

+0

Да, но так что? Я не понимаю. Если метод высмеивается, не имеет значения, что делает его реализация. В любом случае ваш тест полностью контролирует поведение любых издевающихся методов. –

ответ

1

Я не был уверен, что интерфейс Holder выглядел так, поэтому я сделал некоторые предположения. Но это, как вы издеваться методом с типом возвращаемого аннулируется с использованием Mockito:

@SuppressWarnings("unchecked") 
@Test 
public final void test() { 
    // given 
    final String expectedStatus = "status"; 
    final String expectedMessage = "message"; 
    final MyPort mockPort = mock(MyPort.class); 
    final Answer<Void> registerAnswer = new Answer<Void>() { // actual parameter type doesn't matter because it's a void method 
     public Void answer(final InvocationOnMock invocation) throws Throwable { 
      // Here I'm stubbing out the behaviour of registerService 
      final Object[] arguments = invocation.getArguments(); 
      // I don't actually care about these, but if you wanted the other parameters, this is how you would get them 
      // if you wanted to, you could perform assertions on them 
      final String name = (String) arguments[0]; 
      final String country = (String) arguments[1]; 
      final String email = (String) arguments[2]; 

      final Holder<String> statusHolder = (Holder<String>) arguments[3]; 
      final Holder<String> messageHolder = (Holder<String>) arguments[4]; 
      statusHolder.put(expectedStatus); 
      messageHolder.put(expectedMessage); 
      // even though it's a void method, we need to return something 
      return null; 
     } 
    }; 
    doAnswer(registerAnswer).when(mockPort).registerService(anyString(), 
      anyString(), anyString(), any(Holder.class), any(Holder.class)); 

    final MyClass object = new MyClass(); 
    object.port = mockPort; 

    // when 
    final Map<String, String> result = object.registerMethod(); 

    // then 
    assertEquals(expectedStatus, result.get("status")); 
    assertEquals(expectedMessage, result.get("message")); 
} 

Для справки, это мой импорт:

import static org.junit.Assert.assertEquals; 
import static org.mockito.Matchers.any; 
import static org.mockito.Matchers.anyString; 
import static org.mockito.Mockito.doAnswer; 
import static org.mockito.Mockito.mock; 

import java.util.HashMap; 
import java.util.Map; 

import org.junit.Test; 
import org.mockito.invocation.InvocationOnMock; 
import org.mockito.stubbing.Answer; 

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

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