2015-06-22 4 views
0

Я использую EasyMock 3+.переопределить содержимое метода void

Я тестирую метод, например. processMessage(), который (будет) удовлетворять моим тестам, но в самом конце метода этот метод также вызывает другой метод dispatchMessage(String msg) того же класса. Этот последний метод использует объект, внедренный @EJB, который мне действительно неинтересен в этом тесте. Конечно - этот объект приводит к исключению NullPointerException.

Как я могу издеваться над этим методом Easymock, чтобы просто игнорировать его код и возвращать пустоту. т.е.

void dispatchMessage(String msg){ 
    return; 
} 

благодаря

ответ

0

Нет необходимости вызывать replay или verify. Я сделал это так. Добавлена ​​аннотация @BeforeClass.

InboundMDB inboundMock; 

@BeforeClass 
public void beforeClass() { 
    inboundMock = new InboundMDB(); 
} 

Затем создается экземпляр строитель EasyMock и добавил метод я не заинтересован. Теперь, Тхи

IMockBuilder<InboundMDB> iMockBuilder = EasyMock 
       .createMockBuilder(InboundMDB.class); 
     inboundMock = iMockBuilder.addMockedMethod("dispatch") 
       .createMock(); 

После этого кода, который вызывается метод испытываемый (оригинал цель). ..

try { 
     inboundMock.processMessage(aMessage); 
    } catch (Exception e) { 
     Assert.fail(e.getMessage()); 
    } 

Конечно, если я опускаю частичный макет, он выдает исключение нулевого указателя, как изначально описано. Теперь этого больше не происходит. Все хорошо.

+0

Я рекомендую использовать 'replay' и' verify', чтобы удостовериться, что вымышленный метод вызывается как ожидалось. Кроме того, я думаю, что метод 'beforeClass' не нужен, так как вы позже перезаписываете' inboundMock'. – eee

0

для насмешливым метода ничтожной, метод expectLastCall() полезно, и вам не нужно ничего возвращать в этом случае в качестве типа возвращаемого значения является недействительным

по существу вам нужно do

mockObject.dispatchMessage(Easymock.anyObject(String.class)); 
Easymock.expectLastcall(); 

надеюсь, что это поможет!

удачи!

2

Вы можете использовать функцию частичного макета EasyMock.

Давайте предположим, что следующий класс:

public class ClassUnderTest { 

    @EJB 
    private SomeEJB someEJB; 

    public void processMessage() { 
     dispatchMessage("some message"); 
    } 

    public void dispatchMessage(String msg) { 
     someEJB.dispatch(msg);   
    } 
} 

Для того, чтобы проверить только метод processMessage вы можете издеваться dispatchMessage:

import org.easymock.EasyMockSupport; 
import org.junit.Test; 

public class ProcessMessageTest extends EasyMockSupport { 

    @Test 
    public void processMessage() throws Exception { 
     ClassUnderTest classUnderTest = createMockBuilder(ClassUnderTest.class) 
      .addMockedMethod("dispatchMessage") 
      .createMock(); 
     classUnderTest.dispatchMessage("some message"); 
     replayAll(); 

     classUnderTest.processMessage(); 

     verifyAll(); 
    } 

} 
+0

Я не могу статически ссылаться на метод createMockBuilder. Он не разрешает метод. Какую версию библиотеки и библиотеки вы используете? импорт? – feder

+0

В этом примере использовался EasyMock 3.3.1. Я добавил полный тестовый класс с импортом в ответ. Кроме того, теперь в этом примере используются 'verifyAll' и' replayAll' (также найденные в 'EasyMockSupport'). – eee

1

Другой альтернативой является использование рамки PowerMock, который работает очень хорошо с EasyMock и некоторые дополнительные функции, которые могут оказаться интересными (например, издевательские создания новых объектов или вызовы статических методов): https://code.google.com/p/powermock/wiki/MockPrivate

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