Я пытаюсь захватить экземпляр издевающегося типа, который создается в тесте. Я не могу заставить его работать.
Учитывая класс:
public class Foo {}
Не удалось выполнить следующий тест:
@RunWith(JMockit.class)
public class FooTest {
@Test
public void capturing(@Capturing Foo expected) {
final Foo actual = new Foo();
assertThat(actual, is(theInstance(expected)));
}
}
Любая идея, что я могу делать неправильно?
Я также попытался использовать поле вместо тестового аргумента (см. Ниже), и он тоже не работает:
@RunWith(JMockit.class)
public class FooTest {
// The captured instance is now a field, instead of a test parameter.
@Capturing private Foo expected;
@Test
public void capturing() {
final Foo actual = new Foo();
assertThat(actual, is(theInstance(expected)));
}
}
В документации указано, что она должна работать, но я не могу заставить ее работать.
благодаря
JMockit v1.7
Вдохновленный ответом на другой вопрос на этом сайте, я получил его для работы с:
@RunWith(JMockit.class)
public class FooTest {
@Test
public void capturing(@Mocked final Foo unused) {
final Foo expected[] = new Foo[1];
new Expectations() {{
new Foo();
result = new Delegate() {
void captureIt(Invocation inv) {
expected[0] = (Foo) inv.getInvokedInstance();
}
};
}};
final Foo actual = new Foo();
assertThat(actual, is(theInstance(expected[0])));
}
}
Тьфу.
Самый простой способ заключается в следующем:
@Test
public void capturing(@Mocked Foo unused)
{
final Foo actual = new Foo();
new Verifications() {{
List<Foo> expected = withCapture(new Foo());
assertThat(actual, is(theInstance(expected.get(0))));
}};
}
Однако используемый выше метод withCapture(T)
был добавлен только в JMockit 1.8, который еще не выпущен.
@Capturing
используется для присвоения захваченных экземпляров фиктивному полю, но никогда не делал этого для фиктивных параметров .@Capturing
для фиктивных параметров. Вы упоминаете в своем комментарии, что экземпляры захвата больше не назначаются для ложных полей ... Я думаю, что документация нуждается в небольшой работе в этой области, чтобы добавить еще один кусочек удивительности к и без того потрясающему программному обеспечению.