代码之家  ›  专栏  ›  技术社区  ›  SledgeHammer

如何为具有依赖关系的服务设置单元测试?

  •  0
  • SledgeHammer  · 技术社区  · 3 年前

    我有一个服务接口:

    interface MyService
    {
        int getItem();
    }
    

    以及一种实施方式:

    @Service
    class MyServiceImpl : implements MyService {
        public MyServiceImpl(List<Loader> loaders) {
        }
    
        public int getItem() {
           Loader loader = getTheLoader();
           return loader.getItem();
        }
    }
    

    我想进行单元测试 MyServiceImpl 。还有更多内容,只需转发 getItem() 调用加载器,所以我想我想测试实际的类。我不想测试一个实际的加载程序,因为这更像是一个集成测试,是吗?

    所以,我不确定这是否是正确的方法?创建Impl类的真实实例,然后创建TestLoader的真实实例?

    @TestInstance(TestInstance.Lifecycle.PER_CLASS)
    public class MyServiceTests {
    
        private MyService myService;
    
        static class TestLoader implements Loader<String, Object> {
           @Override
           int getItem() {
           }
        }
    
        @BeforeAll
        void init() {
            myService= new MyServiceImpl(List.of(new 
             TestLoader()));
        }
    

    我确实想捕获对TestLoader::getItem等的调用计数。

    有点像我需要创建一个模拟加载程序而不是真正的加载程序来捕获调用计数?

    但不清楚我会如何嘲笑 Loader<String, Object> 并重写getItem()类。

    1 回复  |  直到 3 年前
        1
  •  1
  •   mamo    3 年前

    如果你想测试类和加载程序,你必须进行集成测试,这是对的,但对于单元测试,你必须模拟其他类(你接下来要测试的类或你已经在其他单元测试中测试过的类)

    您可以模拟加载器(您可以使用 mockito )并创建一个包含mock的新列表

    @TestInstance(TestInstance.Lifecycle.PER_CLASS)
    public class MyServiceTests {
    
        private MyService myService;
    
        @Mock
        private Loader loader;
    
        @BeforeAll
        void init() {
            myService= new MyServiceImpl(List.of(loader));
        }
    }