【问题标题】:How can I write junit for multi level service classes in java如何在java中为多级服务类编写junit
【发布时间】:2021-01-14 11:12:09
【问题描述】:

假设我有一个控制器和多个服务。

Class Controller1{
     private ServiceA servicea;
}

Class ServiceA {
     private ServiceB serviceb;
}

Class ServiceB {
     private ServiceC servicec;
     private Utility utility;
}

Class ServiceC {
     private Dao dao;
}

在 bouve 示例中,如果我想为 ServiceA 编写单元测试,那么我必须模拟 ServiceB。

第一个问题:只测试一个服务类对我来说没有多大意义,因为这些都是相关的服务并且协同工作。

我可以将 ServiceB 和 ServiceC 注入 ServiceB 而不是模拟它们吗?

基本上我不想参加任何服务课程。我只想模拟 Dao 层。

但问题是 Dao 非常流畅。

我该如何解决这个问题?非常感谢任何帮助。

我的代码示例

@ExtendWith(MockitoExtension.class)
@TestInstance(Lifecycle.PER_CLASS)
public class ServiceTest {

    @InjectMocks
    ServiceA servicea;
    
    @Mock
    ServiceB serviceb;
    @Mock
    ServiceC servicec;

    
    @Test
    public void testFeatureOne() 
    {
      
    }

}

【问题讨论】:

    标签: java unit-testing junit junit5


    【解决方案1】:

    只测试一个服务类对我来说没有多大意义, 因为这些都是相关的服务,并且协同工作。

    您想进行单元测试还是集成测试?如果您想要单元测试,那么您应该分别测试每个服务。使用 Mockito,您既可以定义模拟服务的响应,也可以验证被测服务是否确实与底层模拟服务交互。

    如果您真的想一次对所有服务进行集成测试,那也没有问题。我相信你可以手动做这样的事情:

    @ExtendWith(MockitoExtension.class)
    @TestInstance(Lifecycle.PER_CLASS)
    public class ServiceTest {
    
      
        ServiceA servicea;
        ServiceB serviceb;
        ServiceC servicec;
    
        @Mock
        Dao dao;
    
        @BeforeEach
        public void setUp(){
            servicec = new ServiceC(dao);
            serviceb = new ServiceB(servicec, new Utility());
            servicea = new ServiceA(serviceb);
        }
        
        @Test
        public void testFeatureOne() 
        {
          
        }
    }
    

    我可能是错的,但我猜你可以对所有 3 个服务上的 @Autowire 注释和 servicec 上的 @InjectMock 做同样的事情(我自己没有尝试过,只是一个猜测)。

    【讨论】:

    • No @InjectMock 不能那样工作。这里服务类是嵌套的。实际上,我们几乎没有复杂的应用程序,并且有多个服务相互交谈以得出解决方案。
    【解决方案2】:

    我可能是错的,但您不想进行单元测试而是集成测试。

    Marting Fowler - Test Pyramid

    【讨论】:

      猜你喜欢
      • 2022-07-25
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      相关资源
      最近更新 更多