Насмешка с использованием JMockit

Мне нужно издеваться над методом в классе java, который выглядит следующим образом:

public class Helper{

    public static message(final String serviceUrl){   

        HttpClient httpclient = new HttpClient();
        HttpMethod httpmethod = new HttpMethod();

        // the below is the line that iam trying to mock
        String code = httpClient.executeMethod(method);

    }
}

Я пытался написать junit на groovy, но не смог этого сделать, поскольку методы метапрограммирования grrovy не применяются для классов java. В своем исследовании я обнаружил, что JMockit — это хороший фреймворк, который также может имитировать объекты, созданные с помощью нового конструктора.

Может ли кто-нибудь показать мне, как написать unittest для вышеуказанного класса либо в java, либо в groovy.

Расширенное спасибо

это тестовый пример, который я пробовал до сих пор с помощью jmockit, но не работает.

void testSend(){

    def serviceUrl = properties.getProperty("PROP").toString()

    new Expectations(){
        {
            HttpClient httpClient=new HttpClient();
            httpClient.executeMethod(); returns null;
        }        
    };
    def responseXml = Helper.sendMessage(requestXml.toString(), serviceUrl)            
}

person Npa    schedule 04.09.2012    source источник
comment
Вы уже пробовали что-нибудь с JMockit? Я знаю, что ваш последний, практически идентичный вопрос предложил JMockit, есть также Mockito и EasyMock. Примеров предостаточно — что вы пробовали?   -  person Dave Newton    schedule 05.09.2012
comment
Я добавил редактирование к моему вопросу, показывающее тест, который я написал .... Поскольку фиктивный объект, который я просматриваю, - это httpClient, как вы думаете, будет ли лучше, если я перейду с java или с groovy для написания тестового примера   -  person Npa    schedule 05.09.2012


Ответы (3)


С jmockit вы также можете имитировать создание экземпляра. Я предпочитаю немного другую технику:

@Test    
public void testFoo(@Mocked final HttpClient client) {
       new Expectations() {{
              // expect instance creation and return mocked one
              new HttpClient(... );  returns(client)

              // expect invocations on this mocked instance
             client.invokeSomeMethid(); returns(something)
       }};


        helper.message(serviceUrl)
}
person Konstantin Pribluda    schedule 05.09.2012
comment
Спасибо за ответ. Как мне начать использовать Jmockit в моем проекте Grails. Я проверил плагин Jmockit в диспетчере плагинов Grails, но не нашел. - person Npa; 05.09.2012
comment
понятия не имею, как работает архитектура плагина Grails. но при условии, что jmockit находится в пути к классам до тестового набора, он может использовать аннотированные классы. Специализированные списки jmockit могут быть лучшим источником информации - person Konstantin Pribluda; 05.09.2012

Java-версия вашего тестового примера будет выглядеть так:

@Test
public void testSend() throws IOException {

    final String serviceUrl = "http://google.com/";

    new Expectations(){
        // these bits are important as they tell Jmockit what classes to mock
        @Mocked HttpClient client ;
        @Mocked GetMethod method;

        {
            HttpClient httpClient= new HttpClient() ;
            HttpMethod method = new GetMethod(withEqual(serviceUrl));
            try {
                httpClient.executeMethod(method);
            } catch (IOException e) {
                // not going to happen
            }
            result = 200;
        }
    };
    // run the test and assert something
    Assert.assertEquals(200, Helper.message(serviceUrl));
}

Это доступно на github.com, обратите внимание, что я использовал httpClient 3.1 для реализации вашего метода сообщения, Я предполагаю, что это не совсем правильно, но должно быть достаточно, чтобы ответить на вопрос.

Если вы сможете подготовить простой проект Grails с вашим тестовым примером, я уверен, что смогу понять, в чем проблема.

Обновление: я играл с игрушечным проектом Grails локально и не смог правильно настроить jmockit. Ключевым моментом с jmockit является обеспечение того, чтобы он был перед junit в пути к классам, но, поскольку junit поставляется в Grails, я не могу найти jmockit в нужном месте.

person Gareth Davis    schedule 05.09.2012
comment
Спасибо за ответ. Как мне начать использовать Jmockit в моем проекте Grails. Я проверил плагин Jmockit в диспетчере плагинов Grails, но не нашел. - person Npa; 05.09.2012
comment
вот почему простая настройка проекта Grails так же, как вы сделали в своем проекте, была бы наиболее полезной. Одной из сложных вещей с JMockit является настройка пути к классам, в частности, он должен быть на CP перед JUnit. - person Gareth Davis; 05.09.2012

спасибо за поднятый вопрос, с Spring-web-3.2.2 (который использует httpclient-4.0.1) мой код выглядит так:

    new NonStrictExpectations(){
        @Mocked(methods={"executeMethod"})
        ClientHttpRequest mocked_req;
        @Mocked(methods={"getBody"})
        ClientHttpResponse mocked_res;
        {
            byte[] buf  = (
            "<example_xml><person><name>Johnson</name><age>20</age></person></example_xml>" 
            ).getBytes();

            mocked_req.execute();
            mocked_res.getBody(); returns(new ByteArrayInputStream(buf));

        }
    };


    RestTemplate mytemplate = new RestTemplate();
    obj =         mytemplate.getForObject(.....);
    assertEquals("returned and parsed obj should be equal to this one", expectedObj, obj);
person teddy teddy    schedule 09.05.2013