3

免责声明:我知道这是一个非常糟糕的设计,实际上让测试相互依赖以设置任何类型的变量。但是,我必须将这些测试迁移到 Arquillian 并且重写一切都是不可能的。


问题:我有使用一些实例变量的测试方法,如下所示:

public int myNumber= 0;

@Test
public void testOne() {
// do something with myNumber
}

@Test(dependsOnMethods = "testOne")
public void testTwo {
// do something with myNumber

这曾经使用 jboss 微容器来工作。但是,在使用 Arquillian 在容器中运行此类测试时,它不会。让这项工作再次发挥作用的最简单方法是什么?现在我只是将所有字段设置为静态,这很有效。这样做有什么负面影响吗?


编辑:塞德里克的建议也不起作用,这可能是由于实例变量不起作用的相同原因。Arquillian 为每个方法调用整个生命周期,@Test看起来它也为每个方法注入了一个新ITestContext@Test。这是我尝试过的:

Integer number = new Integer(10);
static final String NUMBER = "number";

@Test(dataProvider = Arquillian.ARQUILLIAN_DATA_PROVIDER)
public void testOne(ITestContext ctx) {
    System.out.println("TEST ONE: " + number);
    number += 100;
    ctx.setAttribute(NUMBER, number);
    System.out.println("CONTEXT " + ctx.getName());
    System.out.println("CONTEXT " + ctx.getAttribute(NUMBER));
}

@Test(dependsOnMethods="testOne", dataProvider = Arquillian.ARQUILLIAN_DATA_PROVIDER)
public void testTwo(ITestContext ctx) {
    System.out.println("TEST TWO: " + number);
    System.out.println("CONTEXT " + ctx.getName());
    System.out.println("CONTEXT " + ctx.getAttribute(NUMBER));
}

结果:

TEST ONE: 10
CONTEXT Arquillian - class com.example.ServerTest
CONTEXT 110
TEST TWO: 10
CONTEXT Arquillian - class com.example.ServerTest
CONTEXT null
4

2 回答 2

0

我不确定是什么导致它停止运行(它应该可以工作),但是您可以ITestContext在这两个方法的签名中声明一个,它将由 TestNG 注入,然后调用setAttribute/getAttribute以在您的方法之间共享参数。

于 2013-06-13T16:26:04.723 回答
0

在测试之间共享数据的最简单方法是使用 (CDI) 托管 bean。

@ApplicationScoped
public class MyTestContext
{
    @Produces @ApplicationScoped
    Map<String, Object> objectStore()
    {
        return new HashMap<>();
    }
}

public class IntegrationTests extends ArquillianTest
{
    @Inject
    Map<String, Object> objectStore; 

    @Test() @InSequence(1)
    public void testReadAllUsers()
    {
        objectStore.put("x", 100);
    }

    @Test() @InSequence(2)
    public void testCreateNewUser() 
    {
        assertThat((Integer)objectStore.get("x")).isEqualTo(100);
    }
}
于 2017-10-13T20:42:54.650 回答