JMock статическое издевательство против локального издевательства
У нас есть большое количество модульных тестов, написанных с использованием JMock 2.5.1, и большинство (все?) Используют локальный объект Mockery, такой как:
@RunWith(JMock.class)
public class SomeTestClass {
private Mockery context;
@Before
public void setUp() {
context = new Mockery();
}
}
Мы решили перейти на JMock 2.8.3, чтобы использовать новые функции, такие как поточно-ориентированные макеты. Однако при существующих модульных тестах под управлением 2.8.3 я получаю:
Testcase: testReordering_GoingUp(com.hcs.orc.board.NameTagList2Test): Caused an ERROR
Mockery named 'context' is null
java.lang.IllegalStateException: Mockery named 'context' is null
at org.jmock.integration.junit4.JMock.mockeryOf(JMock.java:67)
at org.jmock.integration.junit4.JMock.createTest(JMock.java:35)
Похоже, что JMock 2.8.3 требует статической версии Mockery. То есть:
@RunWith(JMock.class)
public class SomeTestClass {
public static Mockery context;
@BeforeClass
public static void globalSetUp() {
context = new Mockery();
}
}
Однако, это создает утечку в Насмешке между тестами. То есть ранее созданные фиктивные объекты все еще существуют даже после теста, что приводит к таким ошибкам, как:
a mock with name fullScreenFrame already exists
java.lang.IllegalArgumentException: a mock with name fullScreenFrame already exists
at org.jmock.Mockery.mock(Mockery.java:128)
at org.jmock.Mockery.mock(Mockery.java:120)
Есть ли способ обновить JMock 2.5.1 до JMock 2.8.3, не перерабатывая 100 (1000?) Модульных тестов?
ПРИМЕЧАНИЕ. Отредактировано для отражения перехода на JMock 2.8.3. JMock 2.6.1 не является последним кодом, несмотря на то, что говорит очень устаревший и не поддерживаемый веб-сайт jmock.org.
3 ответа
Обходной путь, на котором я остановился, был между моим первым проходом и ответом @Foxsly. Это позволяет мне перейти на JMock 2.8.3, не переписывая больше, чем мое объявление насмешек (и удалить @RunWith
).
public class SomeTestClass {
@Rule
public JUnitRuleMockery context = new JUnitRuleMockery();
private SomeOtherClass fullScreenFrame;
@Before
public void setUp() {
fullScreenFrame = context.mock(SomeOtherClass.class);
}
}
Попробуйте удалить @RunWith(JMock.class)
аннотация - я полагаю, что она устарела в одном из выпусков 2.6.x (в зависимости от того, что было введено JUnitRuleMockery).
Кроме того, вы можете использовать аннотации для создания экземпляров ваших макетов, если хотите:
public class SomeTestClass {
@Rule
public JUnitRuleMockery context = new JUnitRuleMockery();
@Mock private SomeOtherClass mockedDependency;
}
Я мог бы обойти эту проблему, создав Mockery в конструкторе классов Test. Тогда он существует, и JMock ищет его, но он будет обновляться при каждом запуске теста.
Возможные обходные пути:
@RunWith(JMock.class)
public class SomeTestClass {
private Mockery context;
public SomeTestClass() {
context = new Mockery();
}
}