dongraa1986 2019-08-29 11:16
浏览 135

Golang中的模拟功能以进行测试

I want to write unittest case for CreateData() function, by mocking FetchAllData() and SaveData() which are in someother package(package2), please help me to mock the function with example,

Thanks in advance


func CreateData(input package1.InputRequest) (output package1.OututResponse){

    ..some code
    ..some code

    DBdata, err := package2.FetchAllData() //function to fetch data from database

    ..some code
    ..some code

    id, insertErr := package2.SaveData(someData) //function to insert data

    ..some code
    ..some code
}

I need to just mock the above function without modifying the function. I'm looking for that

  • 写回答

1条回答 默认 最新

  • duanhuoyao7011 2019-08-29 15:41
    关注

    Make use of the interface feature. It may require some change to the dependencies (in this example, the package2).

    Change your code to something like this (the point is, to define several interfaces for better testability):

    type Fetcher interface {
        FetchAllData() ([]Data, error)
    }
    
    type Saver interface {
        SaveData([]Data) (int, error)
    }
    
    
    func CreateData(input package1.InputRequest) (output package1.OututResponse){
    
        ..some code
        ..some code
    
        // when you are writing tests, replace it with `s := NewMocking()`
        s := package2.NewStorage()
    
        DBdata, err := s.FetchAllData() //function to fetch data from database
    
        ..some code
        ..some code
    
        id, insertErr := s.SaveData(someData) //function to insert data
    
        ..some code
        ..some code
    }
    

    A little change to the package2 is needed:

    type MyStorage struct {}
    
    func (s *MyStorage) FetchAllData ([]Data, error) {
        // ... some fetching code
    }
    
    func (s *MyStorage) SaveData(someData []Data) (int, error) {
        // ... some saving code
    }
    
    func NewStorage() *MyStorage {
        // ... some initialization
    }
    

    When you want to do some tests without a requirement of package2, define your own mocking type:

    type Mocking struct {}
    
    func (s *Mocking) FetchAllData ([]Data, error) {
        // ... some mocking logic
    }
    
    func (s *Mocking) SaveData(someData []Data) (int, error) {
        // ... some mocking logic
    }
    
    func NewMocking() *Mocking {
        // ... initialize ...
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)