java @After,@before在testcase中不工作

vtwuwzda  于 2023-05-27  发布在  Java
关注(0)|答案(8)|浏览(274)

我已经开始测试,现在我想使用@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不能同时工作?

h79rfbju

h79rfbju1#

使用@BeforeEach代替@Before,使用@AfterEach代替@After

z0qdvdin

z0qdvdin2#

AbstractTransactionalDataSourceSpringContextTests类强制使用旧的JUnit 3.x语法,这意味着任何JUnit 4注解都将不起作用。
执行方法runBare()不是因为@Before注解,而是因为它被命名为runBare(),这是ConditionalTestCase和JUnit TestCase类提供的方法。
所以你有两个解决方案:

  • 使用AlexR答案使用JUnit 4测试和Spring;
  • 保留AbstractTransactionalDataSourceSpringContextTests的继承,但使用onSetUponTearDown方法,而不是@Before@After方法。
lx0bsm1f

lx0bsm1f3#

检查您是否正在使用Junit 4,因为从Junit 5开始,@Before/@After现在是@BeforeEach/@AfterEach,类似地,@BeforeClass/@AfterClass是@AfterAll/@BeforeAll。

yhqotfr8

yhqotfr84#

它应该能工作。。但由于您正在使用Spring框架,并且JUnit 4是几年前引入的,因此我建议您使用注解而不是继承。
所以,用@RunWith(SpringJUnit4ClassRunner.class)注解你的类。删除extends AbstractTransactionalDataSourceSpringContextTests
不要忘记将@Before和@After方法设置为静态
现在它应该工作。
即使你想扩展Spring抽象测试类,至少要注意其中一些是不推荐使用的。例如,类AbstractTransactionalDataSourceSpringContextTests已被弃用。

5w9g7ksd

5w9g7ksd5#

JUnit Jupiter,又名“JUnit 5”:使用@BeforeAll

如果您使用较新的JUnit Jupiter(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对此要求更严格(要求staticLifecycle.PER_CLASS)的可能原因是,它希望测试作者承认,在@BeforeAll方法中初始化的任何资源示例将真正在类中的每个单元测试方法之间共享。这可能会损害它们的隔离性,例如,如果上面示例中的sharedResource不是无状态/幂等的。
如果sharedResource不能被安全地共享(或者如果它是合理的轻量级),则应该使用@BeforeEach来注解init方法,这将在执行类中的每个单独测试之前创建一个新示例。
TestInstance的Javadoc解释了如何使用Lifecycle.PER_CLASS实际上强制执行测试类的单个示例;而JUnit 4和更早版本的行为等效于Lifecycle.PER_METHOD,它为其中包含的每个@Test方法创建了测试类的新示例。这可能会误导作者,使其认为@Before对每个测试只执行一次。

plicqrtu

plicqrtu6#

如果在IDE中使用自动导入,请确保从org.junit包导入@Test@Before

aurhwmvo

aurhwmvo7#

在我例子中,我遇到了问题,解决方案是更改java访问修饰符,它是私有的。
before(not working)@Test void validate()throws Exception {}
after(working)@Test public void validate()抛出Exception {}

k10s72fa

k10s72fa8#

  • 在我的例子中,我只是将@Before/@BeforeEach注解的setUp()方法中的内容移到了单元测试类的构造函数中。
  • 根据this thread,使用构造函数“等效”于@Before方法

我不能解释为什么它解决了这个问题,但我在一个特定的类中遇到了这个问题,它确实做到了。

相关问题