gpt4 book ai didi

java - 为多个测试类只执行一次初始化代码

转载 作者:搜寻专家 更新时间:2023-11-01 01:50:38 24 4
gpt4 key购买 nike

我正在为我的代码编写单元测试用例。我将 PowerMockito 与 Junit 一起使用。我已经编写了一个初始化代码,它将处理我应用程序中的所有初始化内容。以下是我的代码的结构方式:

Class ServiceInitializer{
public static isInitialized = Boolean.FALSE;

public static void initialize(){
//Initilization Code Goes Here
isInitialized = Boolean.TRUE;
}
}

@RunWith(PowerMockRunner.class)
class BaseTest{

@Before
public void preTest(){
//some code
}


static{
if(!ServiceInitializer.isInitialized){
ServiceInitializer.initialize();
}
}

@After
public void postTest(){
//some code
}
}

public TestClass1 extends BaseTest{
@Test
public void testMethodA_1(){//test code}

@Test
public void testMethodA_2(){//test code}

@Test
public void testMethodA_3(){//test code}
}

public TestClass2 extends BaseTest{
@Test
public void testMethodB_1(){//test code}

@Test
public void testMethodB_2(){//test code}

@Test
public void testMethodB_3(){//test code}
}

我使用 Junit 和 batchtest 目标将这些测试用例作为 ant 脚本执行,如下所示:

<junit printsummary="yes" haltonfailure="yes" showoutput="yes">
<classpath refid="JUnitTesting.classpath"/>
<batchtest haltonerror="false" haltonfailure="no" todir="${junit.output.dir}/raw">
<formatter type="plain"/>
<formatter type="xml"/>
<fileset dir="${basedir}/src">
<include name="**/Test*.java"/>
</fileset>
</batchtest>
</junit>

我能够很好地执行测试用例,但是它的初始化代码写在 BaseTest 类的静态 block 中,这给我带来了问题。每当 New Test Class 开始执行时,“ServiceInitializer.initialize();”每次都被调用。所以,如果我有 10 个测试类,那么这个方法将被调用 10 次。我想控制它,无论我有多少测试类,它都只执行一次。我怎样才能做到这一点?使用 JUnit 甚至可以做到这一点吗?

--更新--

我知道有可用的 @BeforeClass 注释,它为每个测试类执行一次代码块。但这并不能满足我的要求,因为一旦 JUnit 运行另一个测试类,它就会调用“@BeforeClass”注释下的方法并再次运行初始化代码,尽管那里进行了初始化检查。

最佳答案

您可以使用类规则:

public class ServiceInitializer extends ExternalResource {
public static final TestRule INSTANCE = new ServiceInitializer();
private final AtomicBoolean started = new AtomicBoolean();

@Override protected void before() throws Throwable {
if (!started.compareAndSet(false, true)) {
return;
}
// Initialization code goes here
}

@Override protected void after() {
}
}

然后您可以通过使用 @ClassRule 注释在您的测试中使用它:

@RunWith(PowerMockRunner.class)
class BaseTest{
@Rule
public PowerMockRule powerMockRule = new PowerMockRule();
@ClassRule
public static final TestRule serviceInitializer = ServiceInitializer.INSTANCE;

@Before
public final void preTest() {
// some code
}

@After
public final void postTest() {
//some code
}
}

编辑: PowerMockRunner 显然不支持 @ClassRule,所以我将测试切换为使用 PowerMockRule .您可以从 here 了解更多信息。 .无论如何,我个人更喜欢规则而不是自定义运行者。

关于java - 为多个测试类只执行一次初始化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34423345/

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