Установка этого параметра на 22.0 помогла мне.
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>22.0</version>
</dependency>
Единственный способ, по которому я думаю, получить желаемую функциональность, - это сделать что-то вроде
import junit.framework.Test;
import junit.framework.TestResult;
import junit.framework.TestSuite;
public class AllTests {
public static Test suite() {
TestSuite suite = new TestSuite("TestEverything");
//$JUnit-BEGIN$
suite.addTestSuite(TestOne.class);
suite.addTestSuite(TestTwo.class);
suite.addTestSuite(TestThree.class);
//$JUnit-END$
}
public static void main(String[] args)
{
AllTests test = new AllTests();
Test testCase = test.suite();
TestResult result = new TestResult();
setUp();
testCase.run(result);
tearDown();
}
public void setUp() {}
public void tearDown() {}
}
. Я использую что-то вроде этого в eclipse, поэтому я не уверен, насколько портативен он снаружи этой среды
Поскольку maven-surefire-plugin не запускает класс класса сначала, но рассматривает классы классов и тестов одинаково, поэтому мы можем настроить плагин, как показано ниже, чтобы включить только классы классов и отключить все тесты. Suite выполнит все тесты.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<includes>
<include>**/*Suite.java</include>
</includes>
<excludes>
<exclude>**/*Test.java</exclude>
<exclude>**/*Tests.java</exclude>
</excludes>
</configuration>
</plugin>
Что касается «Примечание: мы используем maven 2 для нашей сборки. Я пробовал использовать фазы pre-amp; post-integration-test maven, но, если тест завершился неудачно, maven останавливается и не запускает пост -integration-test, который не помогает ».
вместо этого вы можете попробовать нерабочее плагин, я думаю, что у него есть возможность обеспечить очистку независимо от настройки или состояния промежуточной стадии
Если вы не хотите создавать набор и должны перечислять все свои тестовые классы, вы можете использовать отражение, чтобы динамически находить число тестовых классов и считать в базовом классе @AfterClass, чтобы сделать tearDown только один раз:
public class BaseTestClass
{
private static int testClassToRun = 0;
// Counting the classes to run so that we can do the tear down only once
static {
try {
Field field = ClassLoader.class.getDeclaredField("classes");
field.setAccessible(true);
@SuppressWarnings({ "unchecked", "rawtypes" })
Vector<Class> classes = (Vector<Class>) field.get(BlockJUnit4ClassRunner.class.getClassLoader());
for (Class<?> clazz : classes) {
if (clazz.getName().endsWith("Test")) {
testClassToRun++;
}
}
} catch (Exception ignore) {
}
}
// Setup that needs to be done only once
static {
// one time set up
}
@AfterClass
public static void baseTearDown() throws Exception
{
if (--testClassToRun == 0) {
// one time clean up
}
}
}
Если вы предпочитаете использовать @BeforeClass вместо статических блоков, вы также можете использовать булевский флаг для выполнения подсчета отражения и тестирования только один раз при первом вызове. Надеюсь, что это кому-то помогает, мне понадобился день, чтобы лучше понять, чем перечислять все классы в пакете.
Теперь вам нужно расширить этот класс для всех ваших тестовых классов. У нас уже был базовый класс, чтобы предоставить некоторые общие вещи для всех наших тестов, поэтому это было лучшее решение для нас.
Вдохновение происходит из этого ответа SO https://stackoverflow.com/a/ 37488620/5930242
Если вы не хотите распространять этот класс повсюду, этот последний ответ SO может делать то, что вы хотите.
Да, можно надежно запускать методы настройки и сбрасывания до и после любых тестов в наборе тестов. Позвольте мне продемонстрировать код:
package com.test;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({Test1.class, Test2.class})
public class TestSuite {
@BeforeClass
public static void setUp() {
System.out.println("setting up");
}
@AfterClass
public static void tearDown() {
System.out.println("tearing down");
}
}
Итак, ваш класс Test1 будет выглядеть примерно так:
package com.test;
import org.junit.Test;
public class Test1 {
@Test
public void test1() {
System.out.println("test1");
}
}
... и вы можете себе представить, что Test2 выглядит схоже. Если вы запустили TestSuite, вы получите:
setting up
test1
test2
tearing down
. Таким образом, вы можете видеть, что установка / отрыв запускается только до и после всех тестов соответственно.
Улов: это работает только в том случае, если вы используете тестовый набор, а не для тестирования Test1 и Test2 как отдельных тестов JUnit. Вы упомянули, что используете maven, и плагин maven surefire любит запускать тесты по отдельности, а не в составе пакета. В этом случае я бы рекомендовал создать суперкласс, который расширяется каждый тестовый класс. Суперкласс затем содержит аннотированные методы @BeforeClass и @AfterClass.
Что касается проблемы с неудачными тестами, вы можете установить maven.test.error.ignore, чтобы сборка продолжалась неудачно тесты. Это не рекомендуется в качестве постоянной практики, но оно должно заставить вас функционировать до тех пор, пока все ваши тесты не пройдут. Более подробно см. Документацию maven surefire .
Мой коллега предложил следующее: вы можете использовать собственный RunListener и реализовать метод testRunFinished (): http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener. html # testRunFinished (org.junit.runner.Result)
Чтобы зарегистрировать RunListener, просто настройте плагин surefire следующим образом: http://maven.apache.org/surefire/ maven-surefire-plugin / examples / junit.html раздел «Использование пользовательских прослушивателей и репортеров»
Эта конфигурация также должна быть выбрана отказоустойчивым плагином. Это решение замечательно, потому что вам не нужно указывать классы, поисковые тесты или любой другой материал - он позволяет Maven делать свою магию, ожидая завершения всех тестов.
Здесь мы
Насколько я знаю, в JUnit нет механизма для этого, однако вы можете попробовать подклассу Suite и переопределить метод run () версией, которая обеспечивает перехваты.