我正在springBoot中开发MicroServices。正在为Service和DAO层编写单元测试。当我使用 @SpringBootTest 时,它将在构建时启动应用程序。但是它不应该开始申请 当我运行单元测试时。我使用了 @RunWith(SpringRunner.class),但是无法在junit类中使用 @Autowired 类实例。如何配置不应启动应用程序的junit测试类,以及如何在junit类中 @Autowired 类实例。
答案 0 :(得分:1)
使用Spring Boot,您可以启动a sliced version of your application进行测试。这将创建一个Spring Context,它仅包含相关的bean的子集,例如仅适用于您的网络层(控制器,过滤器,转换器等):@WebMvcTest
。
有一个类似的注释可以帮助您测试DAO,因为它仅填充JPA和数据库相关的bean(例如EntitiyManager
,Datasource
等):@DataJpaTest
。
如果您要自动装配不属于上述注释所创建的Spring Test Context的一部分的豆,则可以使用@TestConfiguration
手动将所需的任何bean添加到测试上下文中
@WebMvcTest(PublicController.class)
class PublicControllerTest {
@Autowired
private MockMvc mockMvc;
@TestConfiguration
static class TestConfig {
@Bean
public EntityManager entityManager() {
return mock(EntityManager.class);
}
@Bean
public MeterRegistry meterRegistry() {
return new SimpleMeterRegistry();
}
}
}
答案 1 :(得分:1)
如果不想启动完整的应用程序,请使用MockitoJUnitRunner进行JUnit5测试。
@Mock注释可以模拟任何服务,存储库和接口。
@InjectMocks用于需要测试的Class对象。
这是一个例子。
@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
public class AServiceTest {
@InjectMocks
AService aService;
@Mock
ARepository aRepository;
@Mock
UserService userService;
@Before
public void setUp() {
// MockitoAnnotations.initMocks(this);
// anything needs to be done before each test.
}
@Test
public void loginTest() {
Mockito.when(aRepository.findByUsername(ArgumentMatchers.anyString())).thenReturn(Optional.empty());
String result = aService.login("test");
assertEquals("false", result);
}
答案 2 :(得分:1)
根据您的测试设置,如果您不想自动装配模拟而是“真实的东西”,您可以简单地注释您的测试类以准确包含您需要的类(加上它们的传递必要时依赖)
例如:
@SpringJUnitConfig({ SimpleMeterRegistry.class })
或
@SpringJUnitConfig
@Import({ SimpleMeterRegistry.class })
或
@SpringJUnitConfig
@ContextConfiguration(classes = { SimpleMeterRegistry.class })
在此处查看基于 JUnit5 的示例Spring Boot Web Data JDBC allin。