为了账号安全,请及时绑定邮箱和手机立即绑定

用Mockito模拟静态方法

用Mockito模拟静态方法

守候你守候我 2019-06-06 13:51:50
用Mockito模拟静态方法我写了一家工厂来生产java.sql.Connection物体:public class MySQLDatabaseConnectionFactory implements DatabaseConnectionFactory {     @Override public Connection getConnection() {         try {             return DriverManager.getConnection(...);         } catch (SQLException e) {             throw new RuntimeException(e);         }     }}我想验证传递给DriverManager.getConnection,但我不知道如何模拟静态方法。我使用JUnit 4和Mockito作为测试用例。有一个好的方法来模拟/验证这个特定的用例吗?
查看完整描述

3 回答

?
www说

TA贡献1775条经验 获得超8个赞

使用PowerMockito在莫基托顶上。

示例代码:

@RunWith(PowerMockRunner.class)@PrepareForTest(DriverManager.class)public class Mocker {

    @Test
    public void shouldVerifyParameters() throws Exception {

        //given
        PowerMockito.mockStatic(DriverManager.class);
        BDDMockito.given(DriverManager.getConnection(...)).willReturn(...);

        //when
        sut.execute(); // System Under Test (sut)

        //then
        PowerMockito.verifyStatic();
        DriverManager.getConnection(...);

    }

更多信息:


查看完整回答
反对 回复 2019-06-06
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

避免使用静态方法的典型策略是创建包装对象并使用包装对象。

包装器对象成为真正的静态类的外观,您不需要测试这些类。

包装器对象可能类似于

public class Slf4jMdcWrapper {
    public static final Slf4jMdcWrapper SINGLETON = new Slf4jMdcWrapper();

    public String myApisToTheSaticMethodsInSlf4jMdcStaticUtilityClass() {
        return MDC.getWhateverIWant();
    }}

最后,测试中的类可以使用这个单例对象,例如,具有一个用于实际使用的默认构造函数:

public class SomeClassUnderTest {
    final Slf4jMdcWrapper myMockableObject;

    /** constructor used by CDI or whatever real life use case */
    public myClassUnderTestContructor() {
        this.myMockableObject = Slf4jMdcWrapper.SINGLETON;
    }

    /** constructor used in tests*/
    myClassUnderTestContructor(Slf4jMdcWrapper myMock) {
        this.myMockableObject = myMock;
    }}

在这里,您可以很容易地测试一个类,因为您不直接使用带有静态方法的类。

如果您使用的是CDI,并且可以使用@Inject注释,那么它就更容易了。只需让包装器bean@ApplicationScoped,将它注入到协作器中(您甚至不需要复杂的构造器进行测试),然后继续进行模拟。


查看完整回答
反对 回复 2019-06-06
  • 3 回答
  • 0 关注
  • 2857 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号