gpt4 book ai didi

jmockit - 如何禁用静态初始化程序?

转载 作者:行者123 更新时间:2023-12-02 17:25:13 36 4
gpt4 key购买 nike

假设我的被测系统是这样的:

public class SysUnderTest {
public int foo() {
Trouble trouble1 = new Trouble();
Trouble trouble2 = new Trouble();
return trouble1.water(1) + trouble2.water(2);
}
}

测试看起来像

public class DummyTest {

@Tested SysUnderTest sut;
@Mocked Trouble trouble;

@Test
public void testTrouble() {
new Expectations() {{
trouble.water(anyInt); returns(10, 20);
}};

assertThat("mocked result", sut.foo(), is(30));

new FullVerificationsInOrder() {{
Trouble t1 = new Trouble();
Trouble t2 = new Trouble();
t1.water(1);
t2.water(2);
}};
}
}

然而,Trouble实际上是一个我无法控制的第 3 方库类,它进行静态初始化,这将在测试环境时失败。

public class Trouble {
static {
troubleInitialize();
};

public int water(int i) {
return 0;
}

private static void troubleInitialize() {
throw new RuntimeException("Trouble");
}
}

我知道我可以使用 MockUp<Trouble>摆脱静态初始值设定项,但我不知道如何使用它以防万一(在我的实际情况下)能够区分两个新实例(在 SysUnderTest 中创建)并验证它们的调用。我尝试了不同的方法,但由于某些原因都失败了

  1. 添加 new MockUp<Trouble>(){@Mock void $clinit(){} };@Before/@BeforeClass , 并保持 @Mocked Trouble trouble; .它似乎不起作用,因为模型操作发生在 DummyTest 之后类已加载,将加载(未修改)Trouble静态初始化时会抛出异常的类

  2. TestSuite 中添加新模型并调用 DummyTest在套件中,与 1 类似的问题。

  3. 简单说一下返回20, 30的行为在假类中,删除 Expectations/Verifications 的用法但我无法验证使用什么参数调用了哪个实例。

有没有更好的方法来解决我的问题?其实我想继续使用Expectaitons/Verifications ,我想要的只是在单元测试期间禁用静态初始化器的某种方法。

最佳答案

使用stubOutClassInitialization在使用 Mocked 时将模拟类的静态初始化更改为空方法。

@Mocked(stubOutClassInitialization=true) Trouble trouble;

关于jmockit - 如何禁用静态初始化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39136536/

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