gpt4 book ai didi

java - 在远程服务器上使用 Arquillian 时 @BeforeClass 注释调用方法两次

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:28:27 25 4
gpt4 key购买 nike

我们正在从使用带有嵌入式 JBoss 的 TestNG 过渡到使用带有远程服务器的 Arquillian。

我们正在运行一个简单的测试,该测试有一个用 @BeforeClass 注释的方法,该方法执行一些测试设置。经过大量挖掘后,似乎该设置方法被调用了两次:一次是在我们执行 Maven 命令以运行测试的控制台上,另一次是在将测试战部署到我们的远程服务器并运行测试时。这是两个独立的 JVMS——一个在容器外运行,另一个在容器内运行。我的偏好是只运行后者。

这是我应该期望的行为还是我可能遗漏了什么?

现在,我们实际上是在检查我们是否在容器中,如果是,我们将运行我们的设置代码。这行得通,但我想知道是否有更好的方法。

我们代码的一些片段(请忽略代码的简单性以及这里确实不需要 setupComponents 方法的事实,我们正在迁移的更复杂的测试将需要此功能):

public class BaseTest extends Arquillian
{
private static Log log = LogFactory.getLog( SeamTest.class );

@Deployment
public static Archive<?> createDeployment()
{
// snip... basically, we create a test war here
}

/**
* todo - there might be a better way to do this
*/
private boolean runningInContainer()
{
try
{
new InitialContext( ).lookup( "java:comp/env" );
return true;
}
catch (NamingException ex)
{
return false;
}
}

@BeforeClass
public void setupOnce() throws Exception
{
getLog().debug( "in setupOnce(): " + runningInContainer() );
if ( runningInContainer() )
{
new ComponentTest()
{
protected void testComponents() throws Exception
{
setupComponents();
}
}.run();
}
}

public User createUser()
{
// ...
}

public Log getLog()
{
// snip...
}

public UserDao getUserDao()
{
// ...
}

public abstract class ComponentTest
{
protected abstract void testComponents() throws Exception;

public void run() throws Exception
{
try {
testComponents();
} finally {

}
}
}

}

public class UserDaoTest extends BaseTest
{
UserDao userDao;

@Override
protected void setupComponents()
{
getLog().debug( "in setupComponents: " + runningInContainer() );
userDao = getUserDao();
}

@Test
public void testGetUser() throws Exception
{
getLog().debug( "in testGetUser: " + runningInContainer() );

new ComponentTest()
{
protected void testComponents() throws Exception
{
User user0 = createUser();
user0.setName( "frank" );

userDao.merge( user0 );

User retrievedUser = userDao.findByName( "frank" );
assertNotNull( retrievedUser );
}

}.run();
}

}

这基本上给我的输出看起来像这样:

从正在执行 mvn 的控制台:

in setupOnce(): false

来自 jboss 服务器:

in setupOnce(): true
in setupComponents: true
in testGetUser: true

最佳答案

这是“预期的”行为。不是很好,但这就是 Arqullian 的工作方式。

JUnit

  • @BeforeClass/@AfterClass 只在客户端执行
  • 测试类的状态在@Test之间丢失,在容器中为每个测试重复整个生命周期
  • @Before/@After 根据运行模式(客户端/服务器)执行

TestNG

  • 一切都在服务器和客户端上运行

关于java - 在远程服务器上使用 Arquillian 时 @BeforeClass 注释调用方法两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10230710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com