Я использовал 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?
Если хотите, фактическую реализацию, которую я пытаюсь достичь (с плохой насмешкой над моей собственной кодовой базой), можно найти здесь.
OI.getInstance()
именно по этой причине. СделайтеOI
параметром конструктораClassThatUsesJoysticks
. - person chrylis -cautiouslyoptimistic-   schedule 05.02.2019@Before
. - person Kyle Anderson   schedule 07.02.2019