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();
    }
}
Другие вопросы по тегам