【发布时间】:2020-07-22 01:16:55
【问题描述】:
我正在使用@SpringBootTest 测试 SpringSecurity 基本身份验证。当我测试它时,h2 数据库不保存数据。我在控制台中没有看到插入语句,我显然在运行我的实际 SpringBoot 时看到了应用程序并从前端插入数据。请帮忙。
下面是我的测试:
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes=ConnectionsAppApplication.class)
@Transactional
public class AuthenticationTest {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Mock
CustDetailsRepository custRepository;
@Mock
BCryptPasswordEncoder encrypt;
@InjectMocks
CustomerServiceImpl customerServiceImpl;
@BeforeEach
public void setup() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
}
@Test
void testAuthentication() {
CustomerDetails customer = new CustomerDetails();
customer.setEmailid("abc.com");
customer.setPassword("abc@123456");
customerServiceImpl.saveUser(customer);
try {
this.mockMvc.perform(get("/api/login")
.with(httpBasic("abc.com","abc@123456")))
.andDo(print())
.andExpect(status().isOk())
.andReturn();
} catch (Exception e) {
e.printStackTrace();
}
}
}
CustomerServiceImpl 类中的 saveUser 方法:
public void saveUser(CustomerDetails customerDetails) {
customerDetails.setPassword(bCryptPasswordEncoder.encode(customerDetails.getPassword()));
custDetailsRepository.save(customerDetails);
}
【问题讨论】:
-
您正在模拟您的存储库。你怎么能期望任何东西都保存在数据库中?
-
@Lesiak 我做错了吗?你能纠正我吗?模拟 SpringJPA 存储库如何无法保存数据。
-
Mock 是一个虚拟对象,您使用它而不是真正的实现来简化您的测试 - 您告诉它将调用什么方法以及回答什么(如果没有设置期望,Mockito 默认回答 null )。如果您在模拟上调用
custDetailsRepository.save,则不会调用数据库。现在由您决定是否要在测试中使用 h2 或模拟存储库。不错的 mockito 教程:baeldung.com/mockito-series -
我将我的服务 customerServiceImpl 转换为 @autowired(集成测试),现在我可以通过测试了。但是,我将检查如何使用 mockito 进行测试,非常感谢这个答案。它帮助了我:)。
-
请注意,如果你想用 SpringBootTest 中的 Mock 替换测试中的某些真实 Bean,则需要使用
@MockBean注释(而不是@Mock)。另外,不要使用@InjectMocks注释。
标签: spring database spring-security mockito spring-boot-test