Как сделать проверки на конкретных экземплярах проверенных классов с данным конструктором в JMockit? - PullRequest
0 голосов
/ 05 февраля 2019

Я использую JMockit для макетирования зависимостей для робота (таких как датчики, джойстики и т. Д.).Для одного из тестов моих классов мне нужно смоделировать два объекта джойстика.

В моем коде джойстики создаются следующим образом:

Joystick joystick1 = new Joystick(0);
Joystick joystick2 = new Joystick(1);

Я читал о том, как сопоставлять конкретные экземпляры объектов в разделе Соответствие экземпляров.в документации JMockit .

Эти шаги, однако, не работают для проверок (или, возможно, я делаю это неправильно), или они включают использование тега @Mocked в параметрах каждого тестаметод, который был бы хлопотом, учитывая тот факт, что я хочу, чтобы это поведение выполнялось для всего класса из нескольких тестов.

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

Поведение, к которому я стремлюсь, выглядит примерно так:

public class ClassUsingJoysticksTest {
    @Injectable
    private Joystick joystick1;

    @Injectable
    private Joystick joystick2;

    @Before
    public void setUp() {
        new Expectations() {{
            new Joystick(0);
            result = joystick1;

            new Joystick(1);
            result = joystick2;
        }};
    }

    @Test
    public void someTest() {
        ClassThatUsesJoysticks classThatUsesJoysticks = new ClassThatUsesJoysticks();
        classThatUsesJoysticks.doSomething();

        new Verifications() {{
            joystick1.setRumble(1D);
            joystick2.setRumble(2D);
        }};
    }
}

Соответствующая часть тестируемого класса:

public class ClassThatUsesJoysticks {
    public void doSomething() {
        Joystick joystick1 = OI.getInstance().getJoystick1(); // OI is our own class.
        Joystick joystick2 = OI.getInstance().getJoystick2();

        joystick1.setRumble(1);
        joystick2.setRumble(2);
    }
}

// OI class that we used to keep track of operator interface.
public class OI {
    private Joystick joystick1, joystick2;

    public OI() {
        joystick1 = new Joystick(0); // First joystick is always on port 0.
        joystick2 = new Joystick(1); // Next joystick is port 1.
    }

    public Joystick getJoystick1() {
        return joystick1;
    }

    public Joystick getJoystick2() {
        return joystick2;
    }
}

Возможно ли что-то подобное с использованием JMockit?

Если хотите, actuaРеализацию, которую я пытаюсь реализовать (с плохой насмешкой над моей собственной базой кода), можно найти здесь .

1 Ответ

0 голосов
/ 07 февраля 2019

У меня это работает с текущей настройкой, как задокументировано .

public class ClassUsingJoysticksTest {
    @Mocked Joystick joystick1;
    @Mocked Joystick joystick2;

    @Before
    public void setUp() {
        new Expectations() {
            new Joystick(0);
            result = joystick1;

            new Joystick(1);
            result = joystick2;
        }
    }

    @Test
    public void testRumbles() {
        classThatUsesJoysticks.doSomething();

        new Verifications() {{
             joystick1.setRumble(1.0);
             joystick2.setRumble(1.0);
        }};
    }
}

Если вы хотите увидеть фактическую реализацию, код здесь .

...