我正在使用JUnit 4测试用例,并且我想使用@AfterClass
批注。要使用它,使用它的方法必须是静态的。在这种方法中,我想使用我的@Inject
ed对象。
但是似乎它们不能是静态的,即,如果它们是静态的,则在测试运行期间为null。实际上,我想在运行完所有测试之后删除某些数据库对象,并且不想使用@After
。
我该如何解决这个问题?我唯一想到的就是按字母顺序运行测试用例,并使zzz()
应用我想要的逻辑。
不使用Spring,使用Arquillian并在测试时将耳朵部署到服务器
首先:由于本质上单元测试(根据定义彼此独立)和数据库(本质上是有状态的)完全不同,因此涉及数据库的单元测试并不是那么简单。
通常不建议您在所有测试之后删除某些数据库对象的方法。在大多数情况下,更好的方法是:
为了实现上述目标,有一些工具。一种是针对数据库填充的出色的Arquillian Persistence Extension。另外一个是DbSetup(这是我的最爱)。
也存在替代方案
[如果不适合使用其他工具,那么您应该知道Arquillian的JUnit集成提供了一个方便的@InSequence
批注,该批注可用于设置测试执行的明确顺序。
@Test @InSequence(1) public void place_order_should_add_order() { // some logic here } @Test @InSequence(2) public void order_should_be_persistent() { // some logic here that depends on the previous test-case }
这远比依赖于方法名称的字母顺序更好。
还请注意,上述方法不是静态的,因此您可以在其中使用容器注入的任何对象,例如DataSource
或EntityManager
等。>