Ошибка выполнения с установкой теста [duplicate]

Java-версия алгоритма Хаверсина, основанная на ответе Романа Макарова на эту тему

public class HaversineAlgorithm {

    static final double _eQuatorialEarthRadius = 6378.1370D;
    static final double _d2r = (Math.PI / 180D);

    public static int HaversineInM(double lat1, double long1, double lat2, double long2) {
        return (int) (1000D * HaversineInKM(lat1, long1, lat2, long2));
    }

    public static double HaversineInKM(double lat1, double long1, double lat2, double long2) {
        double dlong = (long2 - long1) * _d2r;
        double dlat = (lat2 - lat1) * _d2r;
        double a = Math.pow(Math.sin(dlat / 2D), 2D) + Math.cos(lat1 * _d2r) * Math.cos(lat2 * _d2r)
                * Math.pow(Math.sin(dlong / 2D), 2D);
        double c = 2D * Math.atan2(Math.sqrt(a), Math.sqrt(1D - a));
        double d = _eQuatorialEarthRadius * c;

        return d;
    }

}
321
задан Michail Michailidis 27 December 2016 в 10:06
поделиться

3 ответа

Код, отмеченный @Before, выполняется перед каждым тестом, а @BeforeClass запускается один раз перед всем тестовым прибором. Если ваш тестовый класс имеет десять тестов, код @Before будет выполняться десять раз, но @BeforeClass будет выполняться только один раз.

В общем случае вы используете @BeforeClass, когда несколько тестов должны делиться такой же дорогостоящий установочный код. Установление соединения с базой данных относится к этой категории. Вы можете переместить код с @BeforeClass в @Before, но ваш тестовый прогон может занять больше времени. Обратите внимание, что код, помеченный @BeforeClass, запускается как статический инициализатор, поэтому он запускается до создания экземпляра класса вашего тестового устройства.

В JUnit 5 теги @BeforeEach и @BeforeAll являются эквивалентами @Before и @BeforeClass в JUnit 4. Их имена немного более показательны, когда они бегают, слабо интерпретируются: «перед каждым тестом» и «один раз перед всеми тестами».

442
ответ дан Erik 17 August 2018 в 18:07
поделиться
  • 1
    Ах, теперь пример с соединением БД имеет смысл. Спасибо! – user1170330 30 November 2013 в 03:51
  • 2
    @pacoverflow @BeforeClas является статическим. Он запускается до создания экземпляров тестового класса. – dasblinkenlight 5 October 2015 в 15:00
  • 3
    Имейте в виду, что при использовании @BeforeClass ваш метод / параметр должен быть статическим – tiagocarvalho92 12 May 2017 в 13:19

До и BeforeClass в JUnit

Аннотации функции @Before будут выполняться перед каждой тестовой функцией в классе, имеющем аннотацию @Test, но функция с @BeforeClass будет выполняться только один раз перед всеми тестовыми функциями в классе.

Аналогичная функция с аннотацией @After будет выполняться после каждой из тестовых функций в классе, имеющем аннотацию @Test, но функция с @AfterClass будет выполняться только один раз после всех тестовых функций в классе.

SampleClass

public class SampleClass {
    public String initializeData(){
        return "Initialize";
    }

    public String processDate(){
        return "Process";
    }
 }

SampleTest

public class SampleTest {

    private SampleClass sampleClass;

    @BeforeClass
    public static void beforeClassFunction(){
        System.out.println("Before Class");
    }

    @Before
    public void beforeFunction(){
        sampleClass=new SampleClass();
        System.out.println("Before Function");
    }

    @After
    public void afterFunction(){
        System.out.println("After Function");
    }

    @AfterClass
    public static void afterClassFunction(){
        System.out.println("After Class");
    }

    @Test
    public void initializeTest(){
        Assert.assertEquals("Initailization check", "Initialize", sampleClass.initializeData() );
    }

    @Test
    public void processTest(){
        Assert.assertEquals("Process check", "Process", sampleClass.processDate() );
    }

}

Выход

Before Class
Before Function
After Function
Before Function
After Function
After Class

В июне 5

@Before = @BeforeEach
@BeforeClass = @BeforeAll
@After = @AfterEach
@AfterClass = @AfterAll
0
ответ дан Dhyan Mohandas 17 August 2018 в 18:07
поделиться

Разница между каждой аннотацией:

+-------------------------------------------------------------------------------------------------------+
¦                                       Feature                            ¦   Junit 4    ¦   Junit 5   ¦
¦--------------------------------------------------------------------------+--------------+-------------¦
¦ Execute before all test methods of the class are executed.               ¦ @BeforeClass ¦ @BeforeAll  ¦
¦ Used with static method.                                                 ¦              ¦             ¦
¦ For example, This method could contain some initialization code          ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute after all test methods in the current class.                     ¦ @AfterClass  ¦ @AfterAll   ¦
¦ Used with static method.                                                 ¦              ¦             ¦
¦ For example, This method could contain some cleanup code.                ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute before each test method.                                         ¦ @Before      ¦ @BeforeEach ¦
¦ Used with non-static method.                                             ¦              ¦             ¦
¦ For example, to reinitialize some class attributes used by the methods.  ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute after each test method.                                          ¦ @After       ¦ @AfterEach  ¦
¦ Used with non-static method.                                             ¦              ¦             ¦
¦ For example, to roll back database modifications.                        ¦              ¦             ¦
+-------------------------------------------------------------------------------------------------------+

Большая часть аннотаций в обеих версиях одинакова, но мало чем отличается.

Ссылка

Порядок выполнения.

Пунктирная рамка -> необязательная аннотация.

68
ответ дан Joby Wilson Mathews 17 August 2018 в 18:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: