Финальный класс: Powermock + easymock + testng - PullRequest
5 голосов
/ 19 мая 2011

Я новичок в PowerMock и не могу найти пример, который соответствует моей ситуации.

Ничего сложного - я пытаюсь использовать PowerMock + EasyMock, чтобы смоделировать последний класс в тесте TestNG.

Вот последний класс:

public final class MyFinalClass {
    private String myString = "someString";

    public final String getMyString() {
        return myString;
    }
}

Тестируемый класс делегируется экземпляру финального класса:

public class MyActiveClass {
    private MyFinalClass finalClass;

    public String getFinalString() {
        return finalClass.getMyString();
    }

    public void setFinalClass(MyFinalClass finalClass) {
        this.finalClass = finalClass;
    }
}

А вот класс Test:

import static org.easymock.EasyMock.expect;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.Assert;
import org.testng.annotations.Test;


@PrepareForTest({ MyFinalClass.class })
public class MyTestClass extends PowerMockTestCase {

    private MyActiveClass activeClass = new MyActiveClass();
    private MyFinalClass mockFinalClass;

    @Test
    public void getFinalString() {
        String expectedString = "mockedReturnString";
        mockFinalClass = PowerMock.createMock(MyFinalClass.class);
        activeClass.setFinalClass(mockFinalClass);
        expect(mockFinalClass.getMyString()).andReturn(expectedString);
        PowerMock.replayAll();
        Assert.assertEquals(activeClass.getFinalString(), expectedString);
        PowerMock.verifyAll();
    }
}

Но когда я запускаю тест, я получаю исключение недопустимого аргумента с жалобой на то, что MyFinalClass не является интерфейсом:

FAILED: getFinalString
java.lang.IllegalArgumentException: MyFinalClass is not an interface
    at java.lang.reflect.Proxy.getProxyClass(Unknown Source)
    at java.lang.reflect.Proxy.newProxyInstance(Unknown Source)
    at org.easymock.internal.JavaProxyFactory.createProxy(JavaProxyFactory.java:24)
    at org.easymock.internal.MocksControl.createMock(MocksControl.java:51)
    at org.powermock.api.easymock.PowerMock.doCreateMock(PowerMock.java:2212)
    at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2163)
    at org.powermock.api.easymock.PowerMock.createMock(PowerMock.java:89)
    at MyTestClass.getFinalString(MyTestClass.java:22)
         ...

Чего мне не хватает?Заранее спасибо за помощь !!!

1 Ответ

1 голос
/ 23 мая 2011

Вот несколько вариантов:

  • Ввести новый интерфейс для MyFinalClass и вместо этого смоделировать этот интерфейс.
  • Если у вас нет прав на редактирование MyFinalClass, вы можете использовать объект-оболочку, который делегирует MyFinalClass, и смоделировать объект-оболочку в вашем тесте.
  • Я не знаю, возможно ли с помощью "powermock + easymock + testng" напрямую смоделировать финальный класс, но, на мой взгляд, можно изменить конечный атрибут с помощью отражения. Так что, может быть, есть лучшее решение.
...