Как смоделировать RestTemplate метод getForObject, используя jmockit?

1

Как getForObject метод RestTemplate классе jmockit с помощью jmockit -

Я пытаюсь сделать так:

   @Test
    public void test2DataClient() {

    new MockUp<RestTemplate>() {

        @Mock
        public String getForObject(String url, Class<String> responseType, Object... urlVariables) {
        return "{(\"error\": \"missing data id\", \"data_id\":2001)}";
        }
    };  
}

Но каждый раз, когда я получаю это error-

java.lang.IllegalArgumentException: Matching real methods not found for the following mocks:

Какие-то мысли, что я тут делаю?

ОБНОВИТЬ:-

Полный StackTrace -

java.lang.IllegalArgumentException: Matching real methods not found for the following mocks:
com.host.dataclient.test.DataTest$3#getForObject(String url, Class responseType, Object[] urlVariables)
    at com.host.dataclient.test.DataTest$3.<init>(DataTest.java:649)
    at com.host.dataclient.test.DataTest.test25dataclient(DataTest.java:649)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:602)
    at java.lang.reflect.Method.invoke(Method.java:602)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Теги:
unit-testing
mocking
resttemplate
jmockit

1 ответ

1
Лучший ответ

На самом деле, подпись метода @Mock не соответствует сигнатуре метода @Mock, как сказано в сообщении об исключении.

Чтобы понять, почему, обратите внимание, что существует только одна реальная реализация метода RestTemplate#getForObject(String, Class, Object[]). Затем рассмотрите, что произойдет для следующего вызова:

Integer i = restTemplate.getForObject("...", Integer.class);

Естественно, этот вызов не должен перенаправляться на метод @Mock имеющий тип возврата String. Итак, правильный макетный метод должен быть:

new MockUp<RestTemplate>() {
    @Mock
    <T> T getForObject(String url, Class<T> responseType, Object... urlVariables) {
        return (T) "{(\"error\": \"missing data id\", \"data_id\":2001)}";
    }
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню