【发布时间】:2020-12-11 07:37:58
【问题描述】:
是否可以在使用 Spring Boot 的单元测试中使用依赖注入?对于集成测试@SpringBootTest,启动整个应用程序上下文和容器服务。但是是否可以在单元测试粒度上启用依赖注入功能?
这是示例代码
@ExtendWith(SpringExtension.class)
public class MyServiceTest {
@MockBean
private MyRepository repo;
@Autowired
private MyService service; // <-- this is null
@Test
void getData() {
MyEntity e1 = new MyEntity("hello");
MyEntity e2 = new MyEntity("world");
Mockito.when(repo.findAll()).thenReturn(Arrays.asList(e1, e2));
List<String> data = service.getData();
assertEquals(2, data.size());
}
}
@Service
public class MyService {
private final MyRepository repo; // <-- this is null
public MyService(MyRepository repo) {
this.repo = repo;
}
public List<String> getData() {
return repo.findAll().stream()
.map(MyEntity::getData)
.collect(Collectors.toList());
}
}
或者我应该将 SUT(服务类)作为 POJO 管理并手动注入模拟的依赖项?我想保持快速测试,但尽量减少样板代码。
【问题讨论】:
-
如果你想要一个单元测试不要使用依赖注入如果你想要一个集成测试或系统测试使用注入。在这里,除了复杂性和缓慢的测试,它不会增加任何东西。只需将
@Autowired替换为@InjectMocks并将@MockBean替换为@Mock并使用正确的mockito 跑步者而不是弹簧扩展。或者只是手动创建服务的模拟和实例(甚至更快)。
标签: java spring spring-boot unit-testing mockito