Удаление ранее определенных ожиданий в JMockit

У меня есть объект, над которым я издеваюсь с помощью JMockit NonStrictExcpection() в методе @Before/setUp() моего тестового класса, чтобы он возвращал значение, ожидаемое для нормального выполнения моего тестируемого класса.

Это нормально для всех моих методов тестирования, за исключением одного теста, в котором я хочу проверить ненормальную работу этого кода.

Я попытался создать новое ожидание в тестовом методе, который, как я полагал, переопределит ожидание в методе setUp, но обнаружил, что ожидание в методе setUp подавляет новое ожидание.

Когда я удаляю ожидание setUp, тестовый метод ведет себя так, как ожидалось (но все мои другие тесты, естественно, терпят неудачу).

Как мне запрограммировать свой тестовый класс, чтобы правильно определить ожидания для каждого теста с минимальным объемом кода? (я знаю, что могу скопировать/вставить код ожидания в каждый метод тестирования, < em>но я не хочу этого делать, если вообще этого можно избежать).

Мой тестовый код выглядит примерно так (обратите внимание, это вроде псевдокода и не компилируется, но вы поняли идею):

public class TestClass{

    @Before
    public void setUp(){

        // Here I define the normal behaviour of mockObject
        new NonStrictExpectations() {{
            mockObject.doSomething();
            result = "Everyting is OK!";
        }};

        // Other set up stuff...

    }

    // Other Tests...

    /**
     * This method tests that an error when calling 
     * mockObject.doSomething() is handled correctly.
     */
    @Test(expected=Exception.class)
    public void testMockObjectThrowsException(){

        // This Expectation is apparently ignored...
        new NonStrictExpectations() {{
            mockObject.doSomething();
            result = "Something is wrong!";
        }};

        // Rest of test method...

    }
}

person chrisbunney    schedule 10.02.2011    source источник


Ответы (2)


Обычно я просто создаю закрытый метод, который возвращает тип Expectations:

private Expectations expectTheUnknown()
{
    return new NonStrictExpectations()
    {{
        ... expectations ...
    }};
}

А затем просто вызовите метод в тестовых методах, которым нужно точное ожидание:

@Test public void testUknown()
{
    expectTheUnknown();
    ... here goes the test ...
}
person Steen    schedule 14.02.2011
comment
Разве это не означает, что вам нужно вручную вызывать expectTheUnknown() для каждого метода тестирования? Кроме того, я думаю, что возвращать NonStrictExpectations на самом деле не нужно. - person Ibrahim Arief; 15.08.2014
comment
@IbrahimArief Прошло много времени с тех пор, как я написал ответ, но AFAIR, смысл вопроса ОП заключался в том, что требовался более детальный контроль над тем, когда вызывается метод. Я не думаю, что есть сомнения, что это решение является хаком, но, по крайней мере, оно работает :) - person Steen; 18.08.2014
comment
О, это прекрасно работает, без сомнения. :) Я просто подтверждал свое беспокойство о том, что, похоже, нет другого пути, кроме как распространить определение expectTheUnknown() на каждый метод в Jmockit, а не иметь какое-то особое ожидание, перекрывающее более общий случай. - person Ibrahim Arief; 18.08.2014

Вы можете лучше использовать MockUp для тестирования на основе состояния. Определите макет, который вы хотите использовать в каждом методе тестирования. Вы можете вызвать метод tearDown MockUp, чтобы удалить макет в конце каждого теста.

Описано здесь

person Justin Rowe    schedule 01.10.2015
comment
Документация по методу jmockit teardown() — javadox.com/org .jmockit/jmockit/1.9/макит/ - person Srinidhi Shankar; 06.08.2020