gpt4 book ai didi

java - 验证对静态方法的调用

转载 作者:搜寻专家 更新时间:2023-10-31 20:17:54 24 4
gpt4 key购买 nike

我想验证 public static void 方法已被调用

@RunWith(PowerMockRunner.class)
@PrepareForTest({ConsoleLog.class})
public class AdContentDataUnitTest {

@Before
public void setUp() throws Exception {
PowerMockito.mockStatic(ConsoleLog.class);
}

@Test
public void adContentData_sendTrackingEvent_noUrl() throws Exception {
mAdContentData = spy(mAdContentData);

// PowerMockito.doNothing().when(ConsoleLog.class);

verifyStatic();
mAdContentData.sendTrackingEvent("event1");
//verifyStatic();
}
}

sendTrackingEvent 将被调用,ConsoleLog.v(String, String) 将被调用。在debug中可以看到调用了静态方法,但是出现如下日志,测试失败:

Wanted but not invoked com.example.logger.ConsoleLog.v(
"AdContentData",
"sendTrackingEvent: event event1 does not exist."
);

我尝试在相同的日志之后添加 verifyStatic,如果我删除第一个验证,则不会检查任何内容。如果我模拟整个 ConsoleLog 类,则会出现错误 Unfinished stubbing detected here: [...] PowerMockitoCore.doAnswer

有谁知道如何正确地做到这一点?

最佳答案

Do anyone know how to do it properly?

是的。根本不要这样做。

假设您有一个像这样调用静态方法的类:

class Person {
private final int id;

Person() {
id = IdGenerator.gen();
}
}

提取对非静态方法的静态调用:

class Person {
private final int id;

Person() {
id = generateId();
}

protected int generateId() {
return IdGenerator.gen();
}
}

现在您可以编写测试,覆盖提取的方法:

    final int id = 1;
Person person = new Person() {
@Override
protected int generateId() {
return id;
}
};

// test with person, knowing we control id

但理想的解决方案实际上是重构被测代码,完全不使用此类静态调用,而是依赖注入(inject)。

关于java - 验证对静态方法的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37203929/

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