免责声明:我知道这是一个非常糟糕的设计,实际上让测试依赖于相互设置任何类型的变量。但是我必须将这些测试迁移到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
答案 0 :(得分:0)
我不确定是什么导致它停止运行(它应该工作),但你可以在这两个方法的签名中声明ITestContext
,这将由TestNG注入,然后调用{{ 1}} / setAttribute
在您的方法之间共享参数。
答案 1 :(得分: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);
}
}