如何为几乎没有依赖关系的服务层编写集成测试
How to write an integration test for Service layer which have few dependencies
我有两个classes
@Service
public class A {
}
@Service
public class B {
@Autowired
private A a;
}
我想编写一个集成测试来测试我的 B class。我不想加载整个 Spring Boot 应用程序,所以 @SpringBootTest 注释对我不起作用。我尝试使用 @WebMvcTest 注释,但它也在加载其他 classes。
有没有办法只加载某些classes或包?
不在给定类型测试(例如单元测试)范围内的模拟依赖项:
@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
.
中的方法
我只知道如何用 TestNG 做到这一点
您的测试 class 应该扩展 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();
}
}
}
我找到了部分答案。
@SpringBootTest(classes = {A.class, B.class})
public class BTest {
@Autowired
private B b;
}
如果你的依赖很少,你可以使用这种方式,但我没有找到启用包初始化的解决方案。
我有两个classes
@Service
public class A {
}
@Service
public class B {
@Autowired
private A a;
}
我想编写一个集成测试来测试我的 B class。我不想加载整个 Spring Boot 应用程序,所以 @SpringBootTest 注释对我不起作用。我尝试使用 @WebMvcTest 注释,但它也在加载其他 classes。
有没有办法只加载某些classes或包?
不在给定类型测试(例如单元测试)范围内的模拟依赖项:
@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
.
我只知道如何用 TestNG 做到这一点
您的测试 class 应该扩展 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();
}
}
}
我找到了部分答案。
@SpringBootTest(classes = {A.class, B.class})
public class BTest {
@Autowired
private B b;
}
如果你的依赖很少,你可以使用这种方式,但我没有找到启用包初始化的解决方案。