easymock задает ожидания по параметрам метода смоделированного объекта - PullRequest
1 голос
/ 24 июня 2011

Я не уверен, как настроить такое поведение с помощью easymock. Для иллюстрации я создал упрощенный пример. По сути, у меня есть метод, который возвращает void, и беру одну карту, и я бы хотел, чтобы easymock изменил карту, удалив запись, которую я указал.

Предположим, у меня есть следующий интерфейс:

public interface Filter{
    public void filter(Map<String,String>map);    

}

и следующий класс:

public class MyClass {
    private Filter filter;
    public MyClass(Filter filter) {
        this.filter = filter;
    }
    public Map<String,String> process(Map<String,String>map) {
       filter.filter(map);
       return map;
    }
}

Я не мог понять, как настроить это поведение:

public class MyClassTest {

    /**
     * Test method for {@link easy.MyClass#process(java.util.Map)}.
     */
    @Test
    public void testProcess() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("one","AAA");
        map.put("remove","BBB");
        map.put("three","CCC");
        Map<String, String> expectedRet = new HashMap<String, String>();
        expectedRet.put("one","AAA");
        expectedRet.put("three","CCC");


        IMocksControl mockery = EasyMock.createControl();
        mockery.resetToStrict();
        mockery.checkOrder(true);

        Filter mockFilter = mockery.createMock("filter", Filter.class);
        MyClass m = new MyClass(mockFilter);
        mockFilter.filter(map);
        // I would like some behaviour that will remove the entry ("remove","BBB")
        // how can I define that?

        mockery.replay();
        m.process(map);        
        mockery.verify();

        assertEquals(expectedRet,map);

    }

}

1 Ответ

0 голосов
/ 24 июня 2011

Вы должны установить ожидание, что m.process(map) вызовет filter(map) на поддельном фильтре:

    Filter mockFilter = mockery.createMock("filter", Filter.class);

    // set expectation
    mockFilter.filter(map);
    replay(mockFilter);

    MyClass m = new MyClass(mockFilter);
    m.process(map);

    // verify expectation
    verify(mockFilter);

Путь, который вы выбрали в приведенном выше фрагменте кода, пытается проверить ваш поддельный фильтр. Это не должно быть целью вашего теста. Тестируемый класс в вашем случае - MyClass, а не Filter.

Обновление: Вы можете добавить поведение к макету:

expect(mockFilter.filter(map)).andDelegateTo(new Filter {
    @Override
    void filter(Map<String, String> map) {
        map.remove("remove");
    }
});

Однако в вашем конкретном случае интерфейс Filter достаточно прост, чтобы заставить andDelegateTo превзойти цель использования макета Filter. С таким же количеством кода вы можете использовать конкретный экземпляр Filter в своем тесте:

class TestFilter implements Filter {
    @Override
    void filter(Map<String, String> map) {
        map.remove("remove");
    }
}

MyClass m = new MyClass(new TestFilter());
m.process(map);
assertNull(map.get("remove"));
...