Простой класс Junit не вызывает метод @Before [duplicate]

По вопросу «что мне делать с этим» может быть много ответов.

Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .

Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет not получить в несогласованном состоянии). Предпосылки означают, что данные, данные как входные данные для функции / метода, должны соответствовать установленным ограничениям и никогда не нарушать их, а постулаты означают, что вывод функции / метода должен соответствовать установленным ограничениям снова не нарушая их. Условия контракта никогда не должны нарушаться во время выполнения программы без ошибок, поэтому дизайн по контракту проверяется на практике в режиме отладки, а отключен в выпусках , чтобы максимизировать развитую производительность системы.

Таким образом, вы можете избежать случаев NullReferenceException, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X в классе, а затем попытаетесь вызвать один из его методов, а X имеет нулевое значение, то это приведет к NullReferenceException:

public X { get; set; }

public void InvokeX()
{
    X.DoSomething(); // if X value is null, you will get a NullReferenceException
}

Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий:

//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant () 
{
    Contract.Invariant ( X != null );
    //...
}

По этой причине Код Контракт существует для приложений .NET.

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

ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .

36
задан Adeel Ansari 9 April 2009 в 08:27
поделиться

4 ответа

НЕ продлить 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
    ...

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

61
ответ дан Carlos Heuberger 31 August 2018 в 15:56
поделиться
  • 1
    – Adeel Ansari 9 April 2009 в 10:03
  • 2
    Благодарю. Мне было трудно найти его на прошлой неделе .. как раз вовремя – Carlos Heuberger 9 April 2009 в 10:44
  • 3
    Спасибо, Карлос, сейчас прекрасно работает. Также спасибо за вашу помощь Уксус. – Lynden Shields 14 April 2009 в 00:30
  • 4
    просто была та же проблема, и это решило это для меня. Благодаря! – Sam 30 January 2012 в 12:52
  • 5
    @yashhy 4 года спустя, но для других читателей, да, это возможно. – MAC 21 June 2018 в 01:45

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

  • Ваш тестовый класс не наследуется от TestCase
  • Метод @BeforeClass является статическим
  • имеют более одного метода @BeforeClass в иерархии тестовых классов (будет выполнен только самый специализированный метод @BeforeClass)
2
ответ дан ben75 31 August 2018 в 15:56
поделиться
  • 1
    Запуск jUnit 4.11 позволяет использовать более одного @BeforeClass, один в вашем классе и один в суперклассе, и вызывает оба. – fishjd 22 April 2016 в 16:40

Чтобы выполнялась функция аннотированной функции, мне пришлось сделать следующее: если вы используете 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);
   }
}
0
ответ дан shacharsol 31 August 2018 в 15:56
поделиться

метод должен быть статическим , а не прямым вызовом fail (иначе другие методы не будут выполнены).

Следующий класс показывает все стандартные типы методов 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");
    }

}

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

@BeforeClass
@Before
@Test
@After
@AfterClass
14
ответ дан Vladimir 31 August 2018 в 15:56
поделиться
  • 1
    Вы правы, спасибо, но не начали работать, как только я изменился на статический. – Lynden Shields 9 April 2009 в 07:29
  • 2
    Покажите нам определение класса. Возможно, ваш класс является подклассом someother, и этот родительский класс может иметь некоторый метод, аннотированный как @BeforeClass, и этот метод родительского класса заканчивается некоторыми ошибками и вызывает остановку. – Adeel Ansari 9 April 2009 в 07:31
  • 3
    В противном случае попробуйте добавить обычный метод проверки. – Adeel Ansari 9 April 2009 в 07:35
  • 4
    Метод не работает при немедленном вызове setUp (), который аннотируется как @before. Класс def: public class myTests расширяет TestCase { – Lynden Shields 9 April 2009 в 07:37
  • 5
    У вас есть какие-либо методы @Test? – Adeel Ansari 9 April 2009 в 07:43
Другие вопросы по тегам:

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