在JUnit 5中参数化beforeEach / beforeAll

时间:2018-08-03 18:55:09

标签: java junit5 parameterized

我想为一个类似数据库的小型应用程序编写一个测试。此应用程序使用查询,并且查询应返回正确的结果。这很容易在JUnit 5中实现,例如

@BeforeEach
void before() {
  database = prepareDatabase();
}

@Test
void testQuery1() {
  assertThat(database.query("query1")).isEqualTo("result1");
}

@Test
void testQuery2() {
  assertThat(database.query("query2")).isEqualTo("result2");
}

....

现在我要添加优化开关(例如查询优化器或数据库索引)。无论运行优化开关如何,查询都应返回相同的结果(优化应只改变效率而不是结果)。

对于测试,这意味着我想为prepareDatabase()的其他其他实现运行相同的方法(例如,一种使用优化程序,一种使用索引,一种不使用索引。

我尚未为此找到合适的扩展名。我想到了为每个优化设置复制整个类,或提供来自共享父类的方法。但是,这感觉不像JUnit 5完成此任务的方式。也许有人可以向我指出可以帮助解决此问题的功能?

2 个答案:

答案 0 :(得分:0)

和往常一样,有多种方法可以实现您的目标。其中之一是使用Java继承。您甚至不需要连接任何高级JUnit 5功能,只需使用旧的Java概念即可。

使用您的方法和抽象prepareDatabase()创建抽象类。

if($request){
   echo 'yes';
   exit();
}

然后-基于不同的变体,创建实现,仅覆盖此方法。

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class userService {
  user: IUser;
  userlist: Array<object> = [];

  constructor(user: IUser) {

   }

    addOject(): void {
       this.userlist.push(this.user);
     }

    getUsers(): any {
        return this.userlist;
    }

}

就是这样。无需任何其他操作,可重用的测试位于父类中,无需重复。

Report example

答案 1 :(得分:0)

缺少的JUnit5功能称为“容器模板”,是在https://github.com/junit-team/junit5/issues/871上的预定功能请求。