2014-02-11 6 views
2

Я использую серию Strict Mocks, сгенерированных с помощью EasyMock 3.2, для тестирования метода, который сам вызывает рекурсию. Установив ожидания моих макетов, я могу управлять этим методом, чтобы он только один раз вызывал себя, а затем выходил. Тем не менее, я вижу очень странное поведение от EasyMock, которое выглядит как ошибка, в которой он путается о том, сколько раз ожидается метод.Использование EasyMock с рекурсивным методом

Например:

final Collection srcCollection = EasyMock.createStrictMock(Collection.class); 
final NativeBroker broker = EasyMock.createMockBuilder(NativeBroker.class) 
    .addMockedMethod("getCollection") 
    .addMockedMethod("getSubject") 
    .createStrictMock(); 

expect(srcCollection.getURI()).andReturn(src); 

replay(srcCollection, broker); 

//run the test 
broker.checkPermissionsForCopy(srcCollection, dest, newName); 

verify(srcCollection, broker); 

ведет к ошибке из EasyMock:

java.lang.AssertionError: 
    Expectation failure on verify: 
     Collection.getURI(): expected: 2, actual: 1 
     at org.easymock.internal.MocksControl.verify(MocksControl.java:226) 
     at org.easymock.EasyMock.verify(EasyMock.java:2080) 

Я только проинструктированы EasyMock ожидать один результат, так почему это кажется, я хочу два? Я также получаю ту же ошибку, если я изменю мои ожидания на это:

expect(srcCollection.getURI()).andReturn(src).once(); 

... И получить ... Незнакомец-х

Если изменить мои ожидания на это:

expect(srcCollection.getURI()).andReturn(src).times(2); 

Я получаю ошибку:

java.lang.AssertionError: 
    Expectation failure on verify: 
     Collection.getURI(): expected: 3, actual: 1 
     at org.easymock.internal.MocksControl.verify(MocksControl.java:226) 
     at org.easymock.EasyMock.verify(EasyMock.java:2080) 

И, кроме того, если я изменю мои ожидания на это:

expect(srcCollection.getURI()).andReturn(src).anyTimes(); 

я получаю еще более странное сообщение об ошибке:

java.lang.IllegalStateException: last method called on mock already has a non-fixed count set. 
    at org.easymock.internal.MocksControl.replay(MocksControl.java:216) 
    at org.easymock.EasyMock.replay(EasyMock.java:2012) 

Кто-нибудь есть какие-либо предложения, или знает о каких-либо ограничениях, связанных с EasyMock в рекурсивных функциях?

+0

это предположение, но попробуйте изменить 'Replay (srcCollection, брокер),' 'на повторе (srcCollection);' – Jason

+0

Было бы полезно посмотреть ваш метод 'getURI'. Кроме того, убедитесь, что вам не нужно издеваться над другими методами в классе NativeBroker. –

+0

@Jason Если я не перепрограммирую «брокер», то мои ожидания для 'getCollection' и' getSubject' на частичном макете сбой. – adamretter

ответ

0

Я не вижу ничего плохого в этом коде.

Являются ли два издевательских методов на брокере ожидаемым не называть?

Я сделал тестовый чехол. Можете ли вы сделать это неудачно?

public class AppTest { 

public static interface Collection { 
    String getURI(); 
} 

public static class NativeBroker { 

    public void checkPermissionsForCopy(Collection srcCollection, String dest, 
      String newName) { 
     srcCollection.getURI(); 
    } 

    public Collection getCollection() { 
     return null; 
    } 

    public String getSubject() { 
     return null; 
    } 
} 

String src = "http://src.com"; 
String dest = "http://dest.com"; 
String newName = "my name"; 

@Test 
public void testApp() { 
    final Collection srcCollection = EasyMock.createStrictMock(Collection.class); 
    final NativeBroker broker = EasyMock.createMockBuilder(NativeBroker.class) 
      .addMockedMethod("getCollection") 
      .addMockedMethod("getSubject") 
      .createStrictMock(); 

    expect(srcCollection.getURI()).andReturn(src); 

    replay(srcCollection, broker); 

    // run the test 
    broker.checkPermissionsForCopy(srcCollection, dest, newName); 

    verify(srcCollection, broker); 
}} 
+0

Ожидается, что будут выработаны два метода на брокерах, я просто опустил их из своего первоначального сообщения для краткости. Тестовый пример можно найти здесь: https://github.com/adamretter/exist/blob/feature/fix-inherited-perms/test/src/org/exist/storage/NativeBrokerTest.java#L226 – adamretter

4

В моем случае я повторил те же ожидаемые значения 2 раза. И он выбрасывает:

java.lang.IllegalStateException: последний метод, называемый mock, уже имеет нефиксированное количество отсчетов.

E.G.

SchedulingDataForVersion dataForVersion = createNiceMock(SchedulingDataForVersion.class); 
TaskSource mockedTaskSource = createNiceMock(TaskSource.class); 

    expect(mockedTaskSource.getOrderElement()).andReturn(orderLine).anyTimes(); 
    expect(mockedTaskSource.getOrderElement()).andReturn(orderLine).anyTimes(); 

    replay(dataForVersion, mockedTaskSource); 

Правильный один:

SchedulingDataForVersion dataForVersion = createNiceMock(SchedulingDataForVersion.class); 
TaskSource mockedTaskSource = createNiceMock(TaskSource.class); 

    expect(dataForVersion.getOrderElement()).andReturn(orderLine).anyTimes(); 
    expect(mockedTaskSource.getOrderElement()).andReturn(orderLine).anyTimes(); 

    replay(dataForVersion, mockedTaskSource 
+0

Получена такая же ошибка и это проверено - убедитесь, что вы не «ожидаете» один и тот же вызов дважды. Я редактировал единичный тест и не понимал, что перед этим насмехались. – Juc

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