Я пишу модульный тест и хочу использовать JUnitParamsRunner
и MockitoJUnitRunner
для одного тестового класса.
К сожалению, не работает следующее:
@RunWith(MockitoJUnitRunner.class)
@RunWith(JUnitParamsRunner.class)
public class DatabaseModelTest {
// some tests
}
Есть ли способ использовать и Mockito, и JUnitParams в одном тестовом классе?
java
unit-testing
junit
Ханс-Хельге
источник
источник
Ответы:
Вы не можете этого сделать, потому что в соответствии со спецификацией вы не можете дважды поместить одну и ту же аннотацию на один и тот же аннотированный элемент.
Итак, какое решение? Решение состоит в том, чтобы поставить только один
@RunWith()
бегунок, без которого вы не можете стоять, и заменить другой на что-то другое. В вашем случае, я думаю, вы удалитеMockitoJUnitRunner
и сделаете программно то, что он делает.Фактически единственное, что он делает, это запускает:
в начале тестового примера. Итак, самое простое решение - поместить этот код в
setUp()
метод:Я не уверен, но, вероятно, вам следует избегать многократного вызова этого метода с использованием флага:
Однако лучше многоразовое решение может быть реализовано с помощью правил JUnt.
Теперь просто добавьте следующую строку в свой тестовый класс:
и вы можете запустить этот тестовый пример с любым бегуном.
источник
mockInitialized
неверна. Вы хотите иметь свежий макет для каждого тетста.Начиная с JUnit 4.7 и Mockito 1.10.17, эта функциональность встроена; есть
org.mockito.junit.MockitoRule
класс. Вы можете просто импортировать его и добавить строкув свой тестовый класс.
источник
@Rule public MockitoJUnitRule mockito = new MockitoJUnitRule(this);
MockitoAnnotations.initMocks(this)
очень медленно создает макеты. Самый эффективный способ - использовать @Runwith (MockitoJunitRunner.class)Это решение работает для всех возможных бегунов, а не только для этого примера mockito. Например; для Spring просто измените классы бегунов и добавьте необходимые аннотации.
DatabaseModelTest
будет выполняться JUnit.TestMockitoJUnitRunner
зависит от него (по логике) , и он будет работать внутри от основных в@Test
методе, во время вызоваJUnitCore.runClasses(TestMockitoJUnitRunner.class)
. Этот метод гарантирует, что главный бегун будет правильно запущен до запускаstatic class TestMockitoJUnitRunner
вспомогательного, эффективно реализуя несколько вложенных@RunWith
аннотаций с зависимыми тестовыми классами.Также на https://bekce.github.io/junit-multiple-runwith-dependent-tests
источник
JUnitCore.runClasses()
без проверки результата, вы рискуете скрыть ошибки из внутреннего теста.assert(JUnitCore.runClasses(TestMockitoJUnitRunner.class).wasSuccessful());
хотя бы сообщит вам об ошибкеС момента выпуска PowerMock 1.6 вы можете делать это так же просто, как
Объясняется здесь https://blog.jayway.com/2014/11/29/using-another-junit-runner-with-powermock/
источник
В моем случае я пытался издеваться над некоторым методом в Spring bean и
не работает. Вместо этого вы должны определить этот bean-компонент для создания с использованием имитационного метода внутри вашего XML-файла, как показано ниже.
и добавьте этот bean-компонент с autowired внутри вашего тестового класса, как показано ниже.
источник
проверьте эту ссылку https://bekce.github.io/junit-multiple-runwith-dependent-tests/, используя этот подход, я объединил @RunWith (Parameterized.class) - внешний бегун - с @RunWith (MockitoJUnitRunner.class) - внутренний бегун. Единственная настройка, которую мне пришлось добавить, - это сделать мои переменные-члены во внешнем классе / бегунке статическими, чтобы сделать их доступными для внутреннего / вложенного бегуна / класса. Удачи и наслаждайся.
источник
Я хотел запустить SWTBotJunit4ClassRunner и org.junit.runners.Parameterized одновременно, у меня есть параметрические тесты, и я хочу делать снимки экрана, когда тест SWT не проходит (функция скриншотов предоставляется SWTBotJunit4ClassRunner ). Ответ @bekce великолепен, и сначала я хотел пойти по этому пути, но это было либо странно, чем аргументы. Или выполнить параметризацию в подклассе и потерять информацию о том, какие именно тесты прошли / не прошли и имеют только последний снимок экрана (поскольку имена снимков экрана получают имя из самого теста). Так что в любом случае это было немного грязно.
В моем случае SWTBotJunit4ClassRunner достаточно прост, поэтому я клонировал исходный код класса, дал ему свое собственное имя ParametrizedScreenshotRunner и там, где оригинал расширял TestRunner , мой класс расширяет класс Parameterized, поэтому по сути я могу использовать свой собственный бегун вместо двух предыдущих. Мой собственный бегун расширяется поверх параметризованного бегуна, реализуя поверх него функцию скриншотов, теперь мой тест использует этот «гибридный» бегун, и все тесты сразу работают, как ожидалось (не нужно ничего менять внутри тестов).
Вот как это выглядит (для краткости я удалил все комментарии из листинга):
источник
Вы также можете попробовать это:
источник