我已经开始测试,现在我想使用@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
不能同时工作?
8条答案
按热度按时间h79rfbju1#
使用
@BeforeEach
代替@Before
,使用@AfterEach
代替@After
。z0qdvdin2#
AbstractTransactionalDataSourceSpringContextTests
类强制使用旧的JUnit 3.x语法,这意味着任何JUnit 4注解都将不起作用。执行方法
runBare()
不是因为@Before
注解,而是因为它被命名为runBare()
,这是ConditionalTestCase
和JUnitTestCase
类提供的方法。所以你有两个解决方案:
AbstractTransactionalDataSourceSpringContextTests
的继承,但使用onSetUp
和onTearDown
方法,而不是@Before
和@After
方法。lx0bsm1f3#
检查您是否正在使用Junit 4,因为从Junit 5开始,@Before/@After现在是@BeforeEach/@AfterEach,类似地,@BeforeClass/@AfterClass是@AfterAll/@BeforeAll。
yhqotfr84#
它应该能工作。。但由于您正在使用Spring框架,并且JUnit 4是几年前引入的,因此我建议您使用注解而不是继承。
所以,用
@RunWith(SpringJUnit4ClassRunner.class)
注解你的类。删除extends AbstractTransactionalDataSourceSpringContextTests
。不要忘记将@Before和@After方法设置为静态
现在它应该工作。
即使你想扩展Spring抽象测试类,至少要注意其中一些是不推荐使用的。例如,类
AbstractTransactionalDataSourceSpringContextTests
已被弃用。5w9g7ksd5#
JUnit Jupiter,又名“JUnit 5”:使用
@BeforeAll
如果您使用较新的JUnit Jupiter(Java 8或更高版本),则需要将
@Before
替换为@BeforeAll
。此外,您需要使用
@TestInstance(Lifecycle.PER_CLASS)
注解测试类,或者使@BeforeAll
方法为static
。下面是一个例子:了解
Lifecycle.PER_CLASS
JUnit 5对此要求更严格(要求
static
或Lifecycle.PER_CLASS
)的可能原因是,它希望测试作者承认,在@BeforeAll
方法中初始化的任何资源示例将真正在类中的每个单元测试方法之间共享。这可能会损害它们的隔离性,例如,如果上面示例中的sharedResource
不是无状态/幂等的。如果
sharedResource
不能被安全地共享(或者如果它是合理的轻量级),则应该使用@BeforeEach
来注解init
方法,这将在执行类中的每个单独测试之前创建一个新示例。TestInstance
的Javadoc解释了如何使用Lifecycle.PER_CLASS
实际上强制执行测试类的单个示例;而JUnit 4和更早版本的行为等效于Lifecycle.PER_METHOD
,它为其中包含的每个@Test
方法创建了测试类的新示例。这可能会误导作者,使其认为@Before
对每个测试只执行一次。plicqrtu6#
如果在IDE中使用自动导入,请确保从
org.junit
包导入@Test
和@Before
。aurhwmvo7#
在我例子中,我遇到了问题,解决方案是更改java访问修饰符,它是私有的。
before(not working)@Test void validate()throws Exception {}
after(working)@Test public void validate()抛出Exception {}
k10s72fa8#
@Before
/@BeforeEach
注解的setUp()
方法中的内容移到了单元测试类的构造函数中。@Before
方法我不能解释为什么它解决了这个问题,但我在一个特定的类中遇到了这个问题,它确实做到了。