dongyuan1160 2018-06-22 10:41
浏览 22

如何避免模拟生成中的导入周期?

Simple example.

I have package xxx. This package contains:

  • struct A
  • interface B which is a field of A
  • struct C which is an argument in method of B

    type A struct {
        SomeField B
    }
    
    type B interface {
        SomeMethod(c C)
    }
    

Now imagine I want to create unit test for structure A and mock dependency B. For creating mock I am using mock generator. All mocks are stored in the common "mocks" folder.

The problem is that generated mock has a dependency on xxx package. This is happening because SomeMethod of interface B has argument xxx.C.

Whenever I try to import my mock structure in a_test.go it fails because of cycle import problem. xxx package importing mocks package in the a_test.go. and mocks package imports xxx package in my generated mock.

I need a peace of advice, what is the best workaround for this? Maybe my approach is not idiomatic enough. Where do you store your mocks?

  • 写回答

2条回答 默认 最新

  • doushi1957 2018-06-22 12:02
    关注

    Use a top level package that all other packages import from. Put your interfaces there.

    For instance:

    domain/
        interfaces.go
    a/
        mock.go
    b/
        mock.go
    c/
        mock.go
    

    a, b and c should import from domain so they don't have any dependencies on each other. You will use duck typing to implement the interfaces of the domain package in your mocks.

    Here's an actual use case using your example:

    domain/interfaces.go:

    type A interface {
        Foo()
    }
    
    type B interface {
        Bar() string
    }
    
    type C interface {
        Baz() string
    }
    

    a/mock.go:

    type A struct {
        SomeField domain.B
    }
    
    // ...
    

    b/mock.go:

    type B struct {
        SomeMethod(c domain.C)
    }
    
    // ...
    

    c/mock.go:

    type C struct {}
    
    // ...
    

    That should compile just fine, because all the mocks import from the top level domain package, and they all implement the respective interfaces.

    评论

报告相同问题?

悬赏问题

  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多