验证对静态方法的调用
Verify call to static method
我想验证 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)
会被调用。在调试中可以看到调用了静态方法,但是出现如下日志,测试失败:
Wanted but not invoked com.example.logger.ConsoleLog.v(
"AdContentData",
"sendTrackingEvent: event event1 does not exist."
);
我尝试在相同的日志之后添加 verifyStatic
,如果我删除第一个验证,则不会检查任何内容。如果我模拟整个 ConsoleLog class,则会出现错误 Unfinished stubbing detected here: [...] PowerMockitoCore.doAnswer
。
有谁知道正确的做法吗?
Do anyone know how to do it properly?
是的。完全不要这样做。
假设您有一个 class 调用这样的静态方法:
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
但理想的解决方案实际上是重构被测代码以完全不使用此类静态调用,而是依赖注入。
我想验证 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)
会被调用。在调试中可以看到调用了静态方法,但是出现如下日志,测试失败:
Wanted but not invoked com.example.logger.ConsoleLog.v(
"AdContentData",
"sendTrackingEvent: event event1 does not exist."
);
我尝试在相同的日志之后添加 verifyStatic
,如果我删除第一个验证,则不会检查任何内容。如果我模拟整个 ConsoleLog class,则会出现错误 Unfinished stubbing detected here: [...] PowerMockitoCore.doAnswer
。
有谁知道正确的做法吗?
Do anyone know how to do it properly?
是的。完全不要这样做。
假设您有一个 class 调用这样的静态方法:
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
但理想的解决方案实际上是重构被测代码以完全不使用此类静态调用,而是依赖注入。