Подтвердить что ты не робот

EasyMock 3.0, mocking class throws java.lang.IllegalStateException: никакой последний вызов на макет доступный

Выполнение следующего unit test исключает исключение: java.lang.IllegalStateException: последний вызов на макет доступный


import org.easymock.*;
import org.junit.*;

public class MyTest {

    @Test
    public void testWithClass() {
        Thread threadMock = EasyMock.createMock(Thread.class);
        EasyMock.expect(threadMock.isAlive()).andReturn(true);
    }
}

Я не уверен, что я делаю неправильно, и не могу найти хороших примеров в Интернете. Как вы издеваетесь над классом с помощью EasyMock 3.0. Что не так с приведенным выше unit test? Любая помощь будет принята с благодарностью.

Мой проект включает следующие зависимости maven

<dependency>
   <groupId>org.easymock</groupId>
   <artifactId>easymock</artifactId>
   <version>3.0</version>
   <scope>test</scope>
</dependency>
<dependency>
   <groupId>cglib</groupId>
   <artifactId>cglib-nodep</artifactId>
   <version>2.2</version>
   <scope>test</scope>
</dependency>
<dependency>
   <groupId>org.objenesis</groupId>
   <artifactId>objenesis</artifactId>
   <version>1.2</version>
   <scope>test</scope>
</dependency>
4b9b3361

Ответ 1

Причиной этого исключения является то, что Thread#isAlive() - это метод final, но EasyMock не поддерживает насмешку окончательных методов. Таким образом, вызов этого метода, который появляется внутри EasyMock.expect(...), не рассматривается как "вызов макета".

Чтобы высмеять окончательные методы, вам понадобится другой инструмент для издевательств, такой как JMockit (который я разрабатываю):

public void testMockingFinalMethod(@Mocked("isAlive") Thread mock)
{
    new Expectations()
    {{
        mock.isAlive(); result = true;
    }};

    assertTrue(mock.isAlive());
}

Издевательский API фактически не требует, чтобы методы, которые были издеваемы, явно указываются в общем случае. Однако класс Thread является сложным.

Ответ 2

Ваш тестовый метод выглядит отлично, за исключением того, что вы не создали подготовленный созданный вами mock-объект. Это нужно сделать, используя

EasyMock.replay(mockObject1, mockObject2, ...);

Это подготовит насмешливый объект, так что он будет использоваться для запуска вашего JUnit. Нет проблем с вашими зависимостями.

Кроме того, вы, кажется, не вызываете фактический метод, который вы тестируете на модуле. Обычно способ записи тестового метода заключается в том, чтобы написать метод JUnit, используя насмешливые библиотеки (например, EasyMock и PowerMock) ТОЛЬКО, когда есть внешние объекты за пределами контекста метода тестирования, а затем воспроизводятся все издевавшиеся объекты (которые подготавливают макеты для замены реальных бизнес-объектов в тесте). После этого вы вызываете фактический метод, который вы пытаетесь протестировать, и проверяете функциональность с помощью методов org.junit.Assert.assertXXX().