首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >构造函数调用了Spock测试方法

构造函数调用了Spock测试方法
EN

Stack Overflow用户
提问于 2018-06-16 05:03:15
回答 1查看 583关注 0票数 0

我有一个Firebase管理助手类,我正在用Spock进行测试。如果需要,该类的构造函数将调用类中的另一个方法来初始化某些字段,如下所示:

代码语言:javascript
运行
复制
public class FirebaseUtility {
    private static FirebaseDatabase db = null;

    public FirebaseUtility() throws IOException {
        if (db == null) {
            initializeFirebase();
        }
    }

    public void initializeFirebase() throws IOException {
        InputStream serviceAccount = ClassLoader.getSystemResourceAsStream("serviceAccount.json");
        FirebaseOptions options = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl("<my_database_url>").build();
        FirebaseApp.initializeApp(options);
        db = FirebaseDatabase.getInstance();
    }
}

基本上,如果已经设置了FirebaseDatabase,那么执行所有初始化代码是没有意义的。

我试过这样做,但似乎行不通:

代码语言:javascript
运行
复制
class FirebaseUtilitySpec extends Specification {

    def "instantiating FirebaseUtility should run initialization code"() {
        given:
            def f
        when:
            f = new FirebaseUtility()
        then:
            1 * f.initializeFirebase()
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-16 07:58:25

首先,您不能检查原始对象上的交互,您需要使用模拟或间谍。此外,这些类型的对象不能拦截静态方法或构造函数上的交互。为此,您必须将Mockito,甚至PowerMock添加到混合中。但是基本上,静态方法是丑陋的,在构造函数调用中初始化静态成员是不必要的。只需为数据库对象使用懒散的getter并拦截其行为即可。

我已经稍微简化了您的示例,消除了外部依赖,只是模拟了Firebase,这样就可以更容易地使用MCVE来回答

代码语言:javascript
运行
复制
package de.scrum_master.stackoverflow;

public class FirebaseDatabase {
  private static FirebaseDatabase instance;

  public static FirebaseDatabase getInstance() {
    if (instance == null)
      instance = new FirebaseDatabase();
    return instance;
  }
}
代码语言:javascript
运行
复制
package de.scrum_master.stackoverflow;

public class FirebaseUtility {
  private static FirebaseDatabase db = null;

  public FirebaseDatabase getDb() {
    if (db == null)
      initializeFirebase();
    return db;
  }

  protected void initializeFirebase() {
    db = FirebaseDatabase.getInstance();
  }
}
代码语言:javascript
运行
复制
package de.scrum_master.stackoverflow

import spock.lang.Specification

class FirebaseUtilitySpec extends Specification {
  def "instantiating FirebaseUtility runs initialization code exactly once"() {
    given:
    FirebaseUtility f = Spy()

    when:
    f.getDb()
    then:
    1 * f.initializeFirebase()

    when:
    f.getDb()
    then:
    0 * f.initializeFirebase()
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50885121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档