java 5教學 - Junit @ Before / @ After叫什麼命令?





beforeclass junit5 (6)


我認為基於@Before和@的文檔,正確的結論是賦予方法獨特的名稱。 我在測試中使用以下模式:

public abstract class AbstractBaseTest {

  @Before
  public final void baseSetUp() { // or any other meaningful name
    System.out.println("AbstractBaseTest.setUp");
  }

  @After
  public final void baseTearDown() { // or any other meaningful name
    System.out.println("AbstractBaseTest.tearDown");
  }
}

public class Test extends AbstractBaseTest {

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

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

  @Test
  public void test1() throws Exception {
    System.out.println("test1");
  }

  @Test
  public void test2() throws Exception {
    System.out.println("test2");
  }
}

作為結果

AbstractBaseTest.setUp
Test.setUp
test1
Test.tearDown
AbstractBaseTest.tearDown
AbstractBaseTest.setUp
Test.setUp
test2
Test.tearDown
AbstractBaseTest.tearDown

這種方法的優點:AbstractBaseTest類的用戶無法意外覆蓋setUp / tearDown方法。 如果他們想要,他們需要知道確切的名字,並且可以做到。

(次要)缺點:用戶在setUp / tearDown之前或之後都看不到有事情發生。 他們需要知道這些東西是由抽像類提供的。 但我認為這就是他們使用抽像類的原因

我有一個集成測試套件。 我有一個IntegrationTestBase類,用於擴展我的所有測試。 這個基類有一個@Beforepublic void setUp() )和@Afterpublic void tearDown() )方法來建立API和數據庫連接。 我一直在做的是重寫每個測試用例中的這兩個方法,並調用super.setUp()super.tearDown() 。 然而,如果有人忘記調用super或將它們放在錯誤的地方並拋出異常,並且忘記在finally或其他地方調用super,這可能會導致問題。

我想要做的是在基類final上創建setUptearDown方法,然後添加我們自己註釋的@Before@After方法。 做一些初始測試時,它總是按以下順序調用:

Base @Before
Test @Before
Test
Test @After
Base @After

但我只是有點擔心,訂單不能保證,可能會導致問題。 我環顧四周,沒有看到有關這個問題的任何事情。 有誰知道我是否可以做到這一點,並沒有任何問題?

碼:

public class IntegrationTestBase {

    @Before
    public final void setUp() { *always called 1st?* }

    @After
    public final void tearDown() { *always called last?* }
}


public class MyTest extends IntegrationTestBase {

    @Before
    public final void before() { *always called 2nd?* }

    @Test
    public void test() { *always called 3rd?* }

    @After
    public final void after() { *always called 4th?* }
}



是的,這種行為是有保證的:

@Before

超類的@Before方法將在當前類的那些之前運行,除非它們在當前類中被覆蓋。 沒有定義其他順序。

@After

在超類中@After方法將在當前類的那些之後運行,除非它們在當前類中被覆蓋。




您可以使用@BeforeClass註釋來確保始終首先調用setup() 。 同樣,您可以使用@AfterClass註釋來確保tearDown()總是最後被調用。

通常不建議這樣做,但它是supported

這不完全是你想要的 - 但它將基本上保持你的數據庫連接在你的測試運行的整個過程中保持打開狀態,然後在最後一次關閉它。




這不是對口號問題的回答,但它是問題主體中提到的問題的答案。 不要使用@Before或@After,而要使用@org.junit.Rule因為它給了你更多的靈活性。 如果您正在管理連接,則ExternalResource (從4.7開始)是您最感興趣的規則。 另外,如果您希望規則的保證執行順序使用RuleChain (從4.10開始)。 我相信當問這個問題時,所有這些都是可用的。 下面的代碼示例是從ExternalResource的javadocs複製的。

 public static class UsesExternalResource {
  Server myServer= new Server();

  @Rule
  public ExternalResource resource= new ExternalResource() {
      @Override
      protected void before() throws Throwable {
          myServer.connect();
         };

      @Override
      protected void after() {
          myServer.disconnect();
         };
     };

  @Test
  public void testFoo() {
      new Client().run(myServer);
     }
 }



如果反過來,可以聲明基類的抽象,並讓後代聲明setUp和tearDown方法(不帶註釋),這些方法在基類的帶註釋的setUp和tearDown方法中調用。




是的,任何數量的構造函數都可以存在於一個類中,並且可以由另一個構造函數使用this() [請不要將this()構造函數調用與this關鍵字混淆]。 this()this(args)應該是構造函數中的第一行。

例:

Class Test {
    Test() {
        this(10); // calls the constructor with integer args, Test(int a)
    }
    Test(int a) {
        this(10.5); // call the constructor with double arg, Test(double a)
    }
    Test(double a) {
        System.out.println("I am a double arg constructor");
    }
}

這被稱為構造函數重載。
請注意,對於構造函數,只有重載概念是適用的,而不是繼承或覆蓋。





java junit installation order teardown