2009-04-09 3 views
35

У меня есть следующий код:Почему мой метод @BeforeClass не работает?

@BeforeClass 
    public static void setUpOnce() throws InterruptedException { 
     fail("LOL"); 
    } 

и различные другие методы, которые являются либо @Before, @After, @test или методы @AfterClass.

Тест не проваливается при запуске, как кажется. Может кто-то мне помочь, пожалуйста?

Я JUnit 4.5

Метод терпит неудачу в непосредственном вызове SETUP(), который, как аннотированной @Before. Класс четкости является:

public class myTests extends TestCase { 
+0

Можете ли вы подтвердить, какая версия junit у вас есть в вашем пути к классу? – Peter

+1

У меня есть JUnit 4.5 в classpath –

ответ

59

не распространяется TestCase и использования аннотаций в то же время !
Если вам нужно создать набор тестов с аннотациями, используйте RunWith аннотацию, как:

@RunWith(Suite.class) 
@Suite.SuiteClasses({ MyTests.class, OtherTest.class }) 
public class AllTests { 
    // empty 
} 


public class MyTests { // no extends here 
    @BeforeClass 
    public static void setUpOnce() throws InterruptedException { 
     ... 
    @Test 
    ... 

(по соглашению: класс имен с прописной буквы)

+0

Да, это лучший вариант. Не знал об этих аннотациях @Suite и @RunWith. +1 и спасибо за ваши входы. –

+0

спасибо. Мне было трудно найти его на прошлой неделе. Как раз вовремя –

+0

Спасибо, Карлос, сейчас отлично работает. Также спасибо за вашу помощь Уксус. У –

13

метод must be static, а не непосредственно вызывать сбой (в противном случае другие методы не будут выполняться).

Следующий класс показывает все стандартные типы JUnit 4 метода:

public class Sample { 

    @BeforeClass 
    public static void beforeClass() { 
     System.out.println("@BeforeClass"); 
    } 

    @Before 
    public void before() { 
     System.out.println("@Before"); 
    } 

    @Test 
    public void test() { 
     System.out.println("@Test"); 
    } 

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

    @AfterClass 
    public static void afterClass() { 
     System.out.println("@AfterClass"); 
    } 

} 

и Ouput это (не удивительно):

@BeforeClass 
@Before 
@Test 
@After 
@AfterClass 
+0

Вы правы, спасибо, но не начали работать после того, как я изменился на статический. –

+0

Покажите нам определение класса. Возможно, ваш класс является подклассом someother, и этот родительский класс может иметь некоторый метод, аннотированный как @BeforeClass, и этот метод родительского класса заканчивается некоторыми ошибками и вызывает остановку. –

+0

В противном случае попробуйте добавить обычный метод тестирования. –

0

Для того, что перед тем аннотированный функция будет бежать, я должен был сделать следующее: Если вы используете Maven, добавить зависимость к JUnit 4.11+:

 <properties> 
       <version.java>1.7</version.java> 
       <version.log4j>1.2.13</version.log4j> 
       <version.mockito>1.9.0</version.mockito> 
       <version.power-mockito>1.4.12</version.power-mockito> 
       <version.junit>4.11</version.junit> 
       <version.power-mockito>1.4.12</version.power-mockito> 
     </properties>   

и зависимость:

 <dependencies> 
     <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>${version.junit}</version> 
     <scope>test</scope> 
     </dependency>  
     . 
     . 
     . 
     </dependencies> 

Убедитесь, что ваш Junit класс Test не расширив класс TestCase, так как это приведет к дублировали версии Пожилым:

public class TuxedoExceptionMapperTest{ 
    protected TuxedoExceptionMapper subject; 

    @Before 
    public void before() throws Exception { 
    subject = TuxedoExceptionMapper.getInstance(); 
     System.out.println("Start"); 
     MockitoAnnotations.initMocks(this); 
    } 
} 
1

Убедитесь, что:

  • Ваш тестовый класс Безразлично 't наследуется от TestCase
  • Метод @BeforeClass является статическим
  • Вы делаете не имеет более одного метода @BeforeClass в иерархии тестового класса (только самый специализированный метод @BeforeClass будет выполнен)
+0

Запуск jUnit 4.11 позволяет использовать более одного @BeforeClass, один в вашем классе и один в суперклассе, и вызывает оба. – fishjd