11

JUnit 4 TestRule ( を拡張)を実装し、テスト クラスExternalResourceに として注入しました@ClassRule。このクラスのすべてのテストでリソースを一度だけ初期化し、最終的に破棄したいと考えています。

私の問題は、私のメソッド@Before@Afterルールメソッドが私のメソッドの前後にまったく呼び出されない@Testことです.なぜこれが起こっているのですか?

最小限のコンパイル可能な例:

package com.acme.test;

import static org.junit.Assert.assertNull;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.rules.ExternalResource;

class Coffee {
    public void throwAway() {}
}

class CoffeeMachine extends ExternalResource {
    Coffee whatElse;    
    @Override protected void before() throws Throwable {
        whatElse = new Coffee();
    }

    @Override protected void after() {
        whatElse.throwAway();
    }

    public Coffee gimmieCoffee() { return whatElse; }
}

public class CoffeeTester {
    @ClassRule public static CoffeeMachine CM = new CoffeeMachine();

    @Test public void drinkACoffee() {
        Coffee c = CM.gimmieCoffee();
        assertNull(c);  // ---> Coffee is null!!                       (fuuuuuuuuuu...)
    }
}

ここで私が誤解していることはありますか?非静的でも同じことが起こることに注意してください@Rule

JUnit 4.11を使用しています。

ヒントをありがとうございました。

4

2 に答える 2

3

ここには問題はありませんが、単なる誤解です。まず第一に、あなたのコードを読んで少し変更しましょうassertit must beあなたのテストc must not be nullが私たちに与えることは明らかです:assertNotNull(c);

何が起こっているかを示すために、いくつかの出力も追加しました。実行してみてください。

package com.acme.test;

import static org.junit.Assert.assertNotNull;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.rules.ExternalResource;

class Coffee {
    public void throwAway() {}
}

class CoffeeMachine extends ExternalResource {
    Coffee whatElse;    
    @Override protected void before() throws Throwable {
        whatElse = new Coffee();
        System.out.println(" ### executing before: " + whatElse);
    }

    @Override protected void after() {
        whatElse.throwAway();
    }

    public Coffee gimmieCoffee() { return whatElse; }
}

public class CoffeeTester {
    @ClassRule public static CoffeeMachine CM = new CoffeeMachine();

    @Test public void drinkACoffee() {
        Coffee c = CM.gimmieCoffee();
        System.out.println(" ### executing test: " + c);
        assertNotNull(c); 
    }
}

私にとっては、次のようになります。

 ### executing before: com.acme.test.Coffee@28f67ac7
[VerboseTestNG] INVOKING: "com.acme.test.CoffeeTester" - com.acme.test.CoffeeTester.drinkACoffee()
 ### executing test: com.acme.test.Coffee@28f67ac7
[VerboseTestNG] PASSED: "com.acme.test.CoffeeTester" - com.acme.test.CoffeeTester.drinkACoffee() finished in 4 ms
[VerboseTestNG] 
[VerboseTestNG] ===============================================
[VerboseTestNG]     com.acme.test.CoffeeTester
[VerboseTestNG]     Tests run: 1, Failures: 0, Skips: 0
[VerboseTestNG] ===============================================

だからcあなたが期待するようにnullではありません。

于 2015-05-15T10:52:29.210 に答える