【问题标题】:How to write an integration test for Service layer which have few dependencies如何为依赖很少的服务层编写集成测试
【发布时间】:2021-04-25 15:09:41
【问题描述】:

我有两节课

@Service
public class A {

}

@Service
public class B {
    @Autowired
    private A a;
}

我想编写一个集成测试来测试我的 B 类。我不想加载整个 Spring Boot 应用程序,所以 @SpringBootTest 注释对我不起作用。我尝试使用 @WebMvcTest 注释,但它也在加载其他类。

有没有办法只加载某些类或包?

【问题讨论】:

  • 意见:一次测试几个但不是所有的应用程序组件几乎没有增加价值。执行广泛的单元测试,然后在整个应用程序堆栈上测试您的业务需求。

标签: java spring spring-boot spring-test spring-test-mvc


【解决方案1】:

我只知道如何用 TestNG 做到这一点 你的测试类应该扩展AbstractTestNGSpringContextTests。现在您还可以添加 Bean 和配置,以便您可以模拟您的 @Autowired 对象,如果需要,它应该类似于以下内容。

例子:

@ContextConfiguration(classes = {MyTest.TestConfig.class})
class MyTest extends AbstractTestNGSpringContextTests {
    private A mockA = mock(A.class);

    @Autowired
    private B b;

    @Configuration
    static class TestConfig {
        @Bean
        public A a() {
            return mockA;
        }

        @Bean
        public B b() {
            return new B();
        }
    }
}

【讨论】:

    【解决方案2】:

    不在给定类型测试(例如单元测试)范围内的模拟依赖项:

    @RunWith(MockitoJUnitRunner.class)
    public class BTest {
        @Mock
        private A aMock;
    
        @InjectMocks
        private B bService;
        
        @Test
        public void testStuff() { ... }
    }
    

    在上面的测试中,我用 @Mock 模拟了 A 服务,它是 B 服务的依赖项。然后通过@InjectMocks 将模拟注入B。然后,您可以测试来自B 的方法,同时模拟来自A 的方法。

    【讨论】:

      【解决方案3】:

      我找到了部分答案。

      @SpringBootTest(classes = {A.class, B.class})
      public class BTest {
      
          @Autowired
          private B b;
      }
      

      如果您的依赖项很少,您可以使用这种方式,但我没有找到启用包初始化的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-15
        • 1970-01-01
        • 2016-01-19
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        相关资源
        最近更新 更多