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>
Ответы
Ответ 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()
.