33

@Afterテストを開始しましたが、使用@Beforeしたいのです@Testが、アプリケーションは@Beforeメソッドを実行するだけで、コンソールに出力を表示します

ただし、削除@After@Beforeて@Testを実行すると。私のコードはここにあります:

public class TestPractise extends AbstractTransactionalDataSourceSpringContextTests{

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

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

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

なぜ@After、同時に動作し@Testないのですか?@before

4

7 に答える 7

54

@BeforeEachの代わりに、@Beforeおよび@AfterEachの代わりに使用し@Afterます。

于 2018-07-25T09:39:51.340 に答える
20

このAbstractTransactionalDataSourceSpringContextTestsクラスは、古いJUnit 3.x構文の使用を強制します。これは、JUnit4アノテーションのいずれも機能しないことを意味します。

メソッドは、アノテーションのためではなく、JUnitクラスによって提供されるメソッドであるという名前が付けられているrunBare()ために実行されます。@BeforerunBare()ConditionalTestCaseTestCase

したがって、2つの解決策があります。

  • AlexRの回答を使用して、JUnit4テストとSpringを使用します。
  • の継承を維持しますAbstractTransactionalDataSourceSpringContextTestsが、onSetUpandonTearDownメソッドの代わりに@Beforeandメソッドを使用し@Afterます。
于 2012-05-14T14:44:58.657 に答える
16

Junit5以降は@Before/@Afterが@BeforeEach/ @ AfterEachになり、同様に@ BeforeClass /@AfterClassが@AfterAll/ @ BeforeAllになるため、Junit4を使用していることを確認してください。

于 2020-07-14T06:58:44.280 に答える
7

動作するはずです...しかし、Spring Frameworkを使用していて、JUnit 4が数年前に導入されたので、継承の代わりにアノテーションを使用することをお勧めします。

したがって、クラスに。で注釈を付けます@RunWith(SpringJUnit4ClassRunner.class)。を削除しextends AbstractTransactionalDataSourceSpringContextTestsます。

@Beforeメソッドと@Afterメソッドを静的にすることを忘れないでください

これで動作するはずです。

Spring抽象テストクラスを拡張したい場合でも、少なくともそれらのいくつかは非推奨であることに注意してください。たとえば、クラスAbstractTransactionalDataSourceSpringContextTestsは非推奨です。

于 2012-05-14T09:35:59.227 に答える
1

IDEで自動インポートを使用する場合は、とがパッケージからインポートされていることを確認し@Testてください@Beforeorg.junit

于 2021-03-08T12:00:36.093 に答える
0

私の場合、解決策はJavaアクセス修飾子を変更することでした。それはかなりプライベートでした。

before(動作していません)@Test void validate()は例外をスローします{}

after(working)@Test public void validate()throws Exception {}

于 2020-10-30T21:40:09.333 に答える
0

JUnit Jupiter、別名「JUnit 5」:使用@BeforeAll

新しいJUnitJupiter(Java 8以降)を使用する場合は、に置き換え@Before@BeforeAllください。

さらに、テストクラスに注釈を付けるか@TestInstance(Lifecycle.PER_CLASS)@BeforeAllメソッドを作成する必要がありますstatic。次に例を示します。

@TestInstance(Lifecycle.PER_CLASS)
class MyTestClass {

    MyHeavyResource sharedResource;

    @BeforeAll
    void init() {
        System.out.println("init");
        sharedResource = new MyHeavyResource(1234);
    }

    @Test
    void myTest() {
        System.out.println("myTest");
        sharedResource.methodUnderTest();
    }
}

理解Lifecycle.PER_CLASS

JUnit 5がこれに対してより厳格である可能性のある理由staticは、メソッドで初期化されたリソースインスタンスがクラス内の個々の単体テストメソッド間で真に共有されるLifecycle.PER_CLASSことをテスト作成者に認識させたいためです。これにより、たとえば上記の例のがステートレス/べき等でない@BeforeAll場合、それらの分離が損なわれる可能性があります。sharedResource

安全に共有できない場合sharedResource(または適度に軽量である場合)、代わりにinitメソッドに注釈を付ける必要があり@BeforeEachます。これにより、クラス内の個々のテストを実行する前に新しいインスタンスが作成されます。

TestInstanceLifecycle.PER_CLASSを使用してテストクラスの単一インスタンスを実際に強制する方法を説明するJavadoc 。一方、JUnit 4以前の動作は、に含まれるメソッドLifecycle.PER_METHODごとにテストクラスの新しいインスタンスを作成すると同等でした。これにより、作成者は、これらのテストごとに1回だけ実行された@Testと誤解する可能性があります。@Before

于 2022-01-27T11:50:53.063 に答える