Easymock - тестирование методом вложенных пустот (шпионаж) - PullRequest
4 голосов
/ 22 декабря 2011

Как подсмотреть параметр 'param' во вложенном методе во время пробного тестирования getData ()?Возможно ли это с Easymock 3?

Исходный код

public class ServiceLogic {

 public void getData(){

  // some business logic

  serviceDAO.executeStatement(param);   

 }

}

Тест Easymock:

ServiceLogic _serviceLogicMock = EasyMock.createNiceMock(ServiceLogic.class);
ServiceDAO _serviceDAOMock = EasyMock.createNiceMock(ServiceDAO .class);

_serviceLogicMock.setServiceDAO(_serviceDAOMock);

//some other method calls -> .execute(...).andReturn(...);
EasyMock.replay(_serviceLogicMock);

//run
_serviceLogicMock.getData();

Как проверить с EasyMock, вызывается ли метод executeStatement () с правильным параметром?!

Ответы [ 3 ]

2 голосов
/ 22 декабря 2011

Ваш тест кажется неправильным:

  • Ваш юнит-тест о тестировании ServiceLogic зачем вы тогда его издеваетесь?
  • Кроме того, у вас нет никаких ожиданий от взаимодействия с вашим ServiceDAO макетом.

Поскольку вопрос помечен Mockito, я предлагаю следующее решение (без импорта), которое вы можете адаптировать к своему коду:

@RunWith(MockitoJUnitRunner.class)
public class ServiceLogicTest {
    @Mock ServiceDAO serviceDAO;
    @InjectMocks ServiceLogic serviceLogic;

    @Test
    public void ensure_executeStatement_is_called_with_right_param() throws Exception {
        // given
        String input = "Some input";

        // when
        serviceLogic.getDataFrom(input);

        // then
        verify(serviceDAO).executeStatement("expected param");
    }
}

При написании тестов мне нравится использовать стиль BDD (Behavior Driven Development), чтобы направлять меня к тому, что я хочу тестировать. Я призываю вас практиковать это, вы можете заглянуть на вики-страницу .

Итак, для вашего вопроса вы должны взглянуть на строку verify, она переводит макет в режим проверки, поэтому может реально проверить, что метод executeStatement действительно вызывается со значением аргумента "expected param".

Если у вас есть более сложные параметры, вы можете использовать некоторые сопоставители, используя библиотеку Hamcrest :

verify(serviceDAO).executeStatement(argThat(hasProperty("propertyName")));

Или вы можете использовать Mockito's ArgumentCaptor в сочетании с FEST-Assert library (обычно мой предпочтительный подход):

ArgumentCaptor<ComplexArgument> argCaptor = ArgumentCaptor.forClass(ComplexArgument.class);
verify(serviceDAO).executeStatement(argCaptor.capture());
assertThat(argCaptor.getValue()).isNotNull().satisfies(myComplexArgumentCondition());

Основная идея состоит в том, чтобы иметь понятный код в рабочем коде и в тестовом коде.

Для дальнейшего чтения взгляните на Mockito Javadoc .

2 голосов
/ 22 декабря 2011

Как и @Brice, я предпочитаю Mockito вместо EasyMock, но вот версия EasyMock, которая ближе к вашему первоначальному примеру, поскольку вашим примером был EasyMock.

public class ServiceLogicTest {

    @Test
    public void ensure_executeStatement_is_called_with_right_param() throws Exception {
        ServiceLogic _serviceLogicUT = new ServiceLogic();
        ServiceDAO _serviceDAOMock = EasyMock.createNiceMock(ServiceDAO .class);

        _serviceLogicUT.setServiceDAO(_serviceDAOMock);

        String input = "Some input";

        //some other method calls -> .execute(...).andReturn(...);
        _serviceDaoMock.executeStatement("expected para");  // assuming a void method
        EasyMock.replay(_serviceDaoMock);            
        // run
        _serviceLogicUT.getDataFrom(input);

        // verifies that the expected calls were made
        EasyMock.verify(_serviceDaoMock);  
    }
}

EasyMock также имеет функцию захвата аргументов. Это будет выглядеть так:

public class ServiceLogicTest {

    @Test
    public void ensure_executeStatement_is_called_with_right_param() throws Exception {
        ServiceLogic _serviceLogicUT = new ServiceLogic();
        ServiceDAO _serviceDAOMock = EasyMock.createNiceMock(ServiceDAO .class);

        _serviceLogicUT.setServiceDAO(_serviceDAOMock);

        String input = "Some input";

        //some other method calls -> .execute(...).andReturn(...);
        Capture<ComplexParam> capturedParam = new Capture<ComplexParam>();
        _serviceDaoMock.executeStatement(EasyMock.capture(capturedParam));  // assuming a void method
        EasyMock.replay(_serviceDaoMock);            
        // run
        _serviceLogicUT.getDataFrom(input);

        ComplexParam actualParam = capturedParam.getValue();

        // make various assertions on actual param
    }
}

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

0 голосов
/ 22 декабря 2011

Это должно быть возможно с jmockit, если только у вас в DAO нет финальных методов. Однако, это лучше и проще сделать с помощью jMockit:

@Test
public void testMethod(@Mocked final ServiceDAO serviceDAO) {
       new Expectations() {{
            serviceDAO.executeStatement(expectedOParams);returns(expectedReturnValue)
       }};

     (new ServiceLogic(serviceDAO)).getData();
}

Это почти завершенные тестовые утверждения сохранения. И это работает с финальными, статическими, абстрактными и другими методами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...