java - 在 TestNG 中使用 IMethodInterceptor 作为监听器时,仅执行最后一个 @Test

标签 java testng testng.xml testng-annotation-test

我正在尝试使用@Factory创建一个类的多个实例,并按照我们使用IMethodInterceptor监听器传递的顺序打印值:

public class MainFactoryClass implements IMethodInterceptor {

@Factory
public Object[] mainFactory() {

    Object[] data = new Object[6];
    data[0] = new MainImpClass(9);
    data[1] = new MainImpClass(10);
    data[2] = new MainImpClass(11);
    data[3] = new MainImpClass(12);
    data[4] = new MainImpClass(13);
    data[5] = new MainImpClass(14);
    return data;
}

@Override
public List<IMethodInstance> intercept(List<IMethodInstance> list, ITestContext 
iTestContext) {

    Map<Integer, IMethodInstance> orders = new TreeMap<>();

    for (IMethodInstance instance : list) {
        MainImpClass testData = (MainImpClass) instance.getInstance();
        orders.put(Integer.valueOf(testData.getA()), instance);
    }

    List<IMethodInstance> orderList = new ArrayList<IMethodInstance>(list.size());      

    for (Integer order : orders.keySet()) {
        IMethodInstance test = orders.get(order);
        orderList.add(test);        
    }
    return orderList;
}

}

如果我有 5 个 @Test 方法来打印类中的值,则它只考虑最后一个 @Test 方法并打印该值。我究竟做错了什么?。即 getValue1、getValue2、getValue3、getValue4 未运行。

尝试使用prioritydependsOnMethods。代码如下:

@Listeners({ MainFactoryClass.class })

public class MainImpClass {
int a;

public MainImpClass(int a) {
    this.a = a;
}

public int getA() {
    return a;
}

@Test(priority = 0)
public void getValue1() {
    System.out.println("Value from getValue1: " + a);
}

@Test(priority = 1)
public void getValue2() {
    System.out.println("Value from getValue2: " + a);
}

@Test(priority = 2)
public void getValue3() {
    System.out.println("Value from getValue3: " + a);
}

@Test(priority = 3)
public void getValue4() {
    System.out.println("Value from getValue4: " + a);
}

@Test(priority = 4)
public void getValue5() {
    System.out.println("Value from getValue5: " + a);
}

}

输出按我们创建实例的顺序排列,但仅从最后一个@Test开始。

Value from getValue5: 9
Value from getValue5: 10
Value from getValue5: 11
Value from getValue5: 12
Value from getValue5: 13
Value from getValue5: 14

testng.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Factory Suite">
<test thread-count="5" name=" Factory Test" group-by- 
instances="true">
<classes>
  <class name="com.trial.MainFactoryClass"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->

最佳答案

当前您的配置是这样的,有 6 个测试实例,每个实例包含 5 个方法。因此总共这 30 个方法将被传递给拦截方法。因此,由于您使用 getA 对它们进行分组,因此 5 个方法中只有一个方法(最后一个)最终在实例的映射中可用。一种解决方案是通过保留列表映射来实现 @Max 的解决方案。

另一种解决方案,假设您使用的是 Java 8+,您可以通过使用排序而不是创建映射来简化拦截方法。

Comparator<IMethodInstance> customCompare = 
   Comparator.comparing(inst -> ((MainImpClass) inst.getInstance()).getA())
             .thenComparing(inst -> inst.getMethod().getPriority());
    
// Now sort the list
list.sort(customCompare);
return list;

有时,这可能会显示一些编译错误,在这种情况下您可以使用:

Comparator<Object> customCompare = 
   Comparator.comparing(inst -> ((MainImpClass) ((IMethodInstance) inst).getInstance()).getA())
             .thenComparing(inst -> ((IMethodInstance) inst).getMethod().getPriority());

注意:最好为工厂和拦截器使用单独的类,因为两者都在做不同的事情。使用 entrySet() 迭代映射并使用 entry.getValue(),而不是使用 keySet() 迭代并通过 map 访问值.get(key)。 (Refer)

关于java - 在 TestNG 中使用 IMethodInterceptor 作为监听器时,仅执行最后一个 @Test,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70889911/

相关文章:

java - 如何从不同的可发送电子邮件的 html 文件构建单个 testNG 可发送电子邮件的报告

Java - 如何将文件的下一列放入数组中

java - equals()方法和==相等还是不相等?

Java ArrayList 添加具有相同 Id 的值

java - 如何使用@Resource 对 boolean 字段进行单元测试

spring - Transactional TestNG 测试导致 Large Objects 可能无法在自动提交模式下使用

java - 有什么方法可以分块而不是全套来划分和运行testng测试

java - 使用 AsyncTask 时屏幕闪烁

java - 关于TestNG的问题