Я некоторое время тестировал поведение своего кода, используя TestNG
и JMockit
, и у меня не было особых проблем с их комбинацией. Сегодня я столкнулся с ситуацией, когда мне нужно было имитировать одну из моих внутренних зависимостей в так называемой широкой манере, и мне не нужно было держать этот макет, так как ни один из тестовых случаев не касался это напрямую, в то время как они рассчитывали на функциональность издевательской версии. Поэтому, естественно, я поместил издевательскую логику в свой файл @BeforeMethod
. Вот пример:
public class SampleTest
{
@Mocked
@Cascading
private InnerDependency dependency;
@BeforeMethod
public void beforeMethod()
{
new NonStrictExpectations()
{
{
dependency.getOutputStream((String)any);
result = new Delegate<OutputStream>()
{
public OutputStream getOutputStream(String url)
{
return null;
}
};
}
};
}
@Test
public void testNormalOperation()
{
// The test whose desired behavior depends on dependency being mocked out
// ..
}
}
Но, поскольку мои тесты не заботятся о фиктивном dependency
явно, я не хочу объявлять его как поле тестового класса, в отличие от того, что сделано выше. Насколько я знаю JMockit
, остались бы только следующие варианты:
Объявите
dependency
как локальное фиктивное поле:new NonStrictExpectations() { @Cascading private InnerDependency dependency; { //... } }
Объявите
dependency
в качестве входного аргумента дляbeforeMethod()
, подобно тому, как это делается для обычных методов@Test
:@BeforeMethod public void beforeMethod(@Mocked @Cascading final InnerDependency dependency) { // ... }
Я вижу, что JMockit 1.6+ не нравится первый вариант и выдается предупреждение с WARNING: Local mock field "dependency" should be moved to the test class or converted to a parameter of the test method
. Поэтому, чтобы все были довольны, я исключаю этот вариант.
Но для второго варианта TestNG
(в настоящее время 6.8.6) выдает исключение при запуске теста, говорящего java.lang.IllegalArgumentException: wrong number of arguments
. Я не вижу такого поведения с обычными @Test
случаями, переданными с @Mocked
параметрами. Даже игра с @Parameter
и @Optional
не поможет (и не должна!).
Итак, есть ли способ заставить это работать, не объявляя ненужное фиктивное поле тестового класса, или я что-то здесь упускаю?
Спасибо