2015-01-03 2 views
0

У меня возникла проблема с проверкой того, сколько раз будут задействованы конкретные методы (IFunction в экземпляре Operation).Метод mock как параметр другой метод

По:

  1. http://easymock.org/user-guide.html#mocking-annotations

  2. http://www.ibm.com/developerworks/library/j-easymock/

  3. How to use EasyMock expect

я написал что-то как:

class Operation{ 
    public double[] calculateSth(IFunction function, int [] t){ 
     for(int i=0 ; i<5 ; i+=1) 
      function(t, new int[]{1,2,3}); 

    return new double[]{1,2,3}; 
    } 

} 

interface IFunction{ 
    double f(int[] a, int[]b); 
} 

class ConcreteF implements IFunction{ 
    double f(int[]a, int[]b){ 
     return 5; 
    } 
} 

И мой испытательный класс: @TestSubject Операция op;

@Mock 
IFunction function; 

@Before 
public void setUp() throws Sth{ 
    op=new Operation(); 
    function = EasyMock.createMock(IFunction.class); 
} 

@Test 
public void howManyTimes(){ 


    EasyMock.expect(function.f(EasyMock.notNull(), EasyMock.notNull()) 
        ) 
    .andReturn((double)EasyMock.anyDouble()).times(3); 


    EasyMock.replay(function); 

    op.calculateSth(function, new double[]{0,0,0}); 

    //verify 
    EasyMock.verify(function); 

} 

Результат: java.lang.NullPointerException

at org.easymock.internal.Injector.injectMocks(Injector.java:80) 
at org.easymock.EasyMockSupport.injectMocks(EasyMockSupport.java:624) 
at org.easymock.EasyMockRunner.withBefores(EasyMockRunner.java:50) 

Это мой первый раз, используя EasyMock и я не знаю, как это исправить;/

ответ

4

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

@TestSubject Operation op;

Эта линия является подозреваемым. Я понимаю, что вы создаете его в методе , но похоже, что Easymock пытается вставить издевательства (те, которые были аннотированы @Mock), прежде чем он что-нибудь сделает (и, понятно, так), и взорвется, так как ссылка null на это пункт.

Поддержка аннотации, представленная в v3.2, также рассматривается как способ устранения необходимости в методе setUp. Но вы, кажется, смешиваете оба и ошибаетесь. Выберите тот или другой вариант - я бы рекомендовал вам использовать аннотации.

Цитируя Easymockuser guide (данное руководство так же хорошо, как это может когда-нибудь, поэтому обязательно прочтите это перед использованием библиотеки),

@RunWith(EasyMockRunner.class) 
public class ExampleTest { 

    @TestSubject 
    private ClassUnderTest classUnderTest = new ClassUnderTest(); // 2 

    @Mock 
    private Collaborator mock; // 1 

    @Test 
    public void testRemoveNonExistingDocument() { 
    replay(mock); 
    classUnderTest.removeDocument("Does not exist"); 
    } 
} 

The mock конкретизируется в бегуна на шаг 1. Затем устанавливается бегун на поле listener на этапе 2. Метод setUp может быть удален , так как вся инициализация выполнялась бегуном.