gpt4 book ai didi

java - 如何使用 @Parameters 在运行之间缓存 JUnit 类字段

转载 作者:行者123 更新时间:2023-11-29 07:51:40 26 4
gpt4 key购买 nike

让我们假设以下 JUnit 测试类:

@RunWith(Parameterized.class)
public class MyTestClass {

private ExpensiveObjectToCreate myObject;

@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][] {
{ "parameter1" },
{ "parameter2" },
};
return Arrays.asList(data);
}

@Test
public void test1() {
}

@Test
public void test2() {
}

public MyTestClass(String stringParameter) {

myObject = new ExpensiveObjectToCreate(stringParameter);
}

}

有什么方法可以让我为每个参数集只创建一次昂贵的对象吗?我这样说是因为 JUnit 为它需要运行的每个测试创建了一个新的测试类。这意味着昂贵的对象不是创建了 2 次,而是实际创建了 4 次(2 个参数集 x 2 个测试)。当我们有很多测试方法时,情况会变得更糟。

此外,将昂贵的对象作为参数发送对我来说不是解决方案,因为我的场景有点复杂(我在 JUnit 规则中创建昂贵的对象)。

最佳答案

为什么不在您的测试用例类中推出一个自定义缓存器,它缓存每个参数创建的实例并在进一步调用时返回相同的实例。

@RunWith(Parameterized.class)
public class Test {

private static ExpensiveObjectCacher cacher; //instance which caches parameter instance
private ExpensiveObject myObject;

public Test(String value) {
this.myObject = cacher.get(value);
}

@BeforeClass
public static void setUpBeforeClass(){
cacher = new ExpensiveObjectCacher();
}

@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][] {
{ "parameter1" },
{ "parameter2" },
};
return Arrays.asList(data);
}

@org.junit.Test
public void test1(){

}

@org.junit.Test
public void test2(){

}
}

//caching for test cases.
class ExpensiveObjectCacher{
private Map<String, ExpensiveObject> map = new ConcurrentHashMap<String, ExpensiveObject>();

ExpensiveObject get(String value){
ExpensiveObject instance = map.get(value);

if(instance == null){
instance = new ExpensiveObject(value);
map.put(value, instance);
}

return instance;
}
}

class ExpensiveObject{
public ExpensiveObject(String value) {
System.out.println("Instance created: " + value);
}
}

输出:

Instance created: parameter1
Instance created: parameter2

关于java - 如何使用 @Parameters 在运行之间缓存 JUnit 类字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20654528/

26 4 0