加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 01:05:49 所属栏目:Java 来源:网络整理
导读:我想验证是否已调用公共静态void方法. @RunWith(PowerMockRunner.class)@PrepareForTest({ConsoleLog.class})public class AdContentDataUnitTest { @Before public void setUp() throws Exception { PowerMockito.mockStatic(ConsoleLog.class); } @Test pu

我想验证是否已调用公共静态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类,则会在此处检测到错误未完成的存根:[…] 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

但理想的解决方案实际上是重构被测试的代码,根本不使用这种静态调用,而是依赖注入.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读