弹簧单元测试存储库保存不起作用



我正在尝试为我的 spring 服务器编写一个单元测试。

首先,它将检查存储库中是否存在用户名,如果不存在,则用户名可用,然后它将返回true,然后我将该用户名保存到我的存储库中,并检查是否可用,而不是它应该返回false。

这是我的代码:

@Test
public void availableTest() {
String username="some_username";
LoginCredential lc=new LoginCredential();
lc.setUsername(username);
lc.setPasswordHash("1");
lc.setSessionID(0);
assertEquals(true, loginCredentialService.available(username));
loginCredentialRepository.save(lc);
assertEquals(false, loginCredentialService.available(username));
}

但出于某种原因,对于最后assertEquals它给了我错误。所以我可以说,数据没有保存在存储库中,因为我已经使用邮递员测试了我的 API。

那么如何解决这个问题呢?

我认为测试类被正确注释:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MainApplicationTests {
@Autowired
private LoginCredentialService loginCredentialService;
@MockBean
private LoginCredentialRepository loginCredentialRepository;
...

你用 H2 标记了 OP,所以我想你知道内存数据库。

如果您使用@SpringBootTest注释,则您正在编写集成测试,因此您将测试由 Spring 连接的完整应用程序。为了提高效率,您可能希望使用内存中数据库进行测试,而不是完整的 SQL Server。

您可以通过添加 H2 数据库作为测试依赖项来实现此目的,Spring Boot 将选取该依赖项用于集成测试存储库。然后,您可以注入实际的存储库:

@Autowired
private LoginCredentialRepository loginCredentialRepository;

此外,您还可以使测试@Transactional。然后每个测试用例将在单独的事务中运行,并且事务将在每次测试后回滚,因此您无需担心交叉测试的污染。

如果你只想对登录凭证服务进行单元测试,你需要在仓库中存根相关方法,例如

@MockBean
private LoginCredentialRepository loginCredentialRepository;
@Test
public void availableTest1() {
when(loginCredentialRepository.existByName(username)).thenReturn(true);
assertEquals(false, loginCredentialService.available(username));
}
@Test
public void availableTest2() {
when(loginCredentialRepository.existByName(username)).thenReturn(false);
assertEquals(true, loginCredentialService.available(username));
}

您也可以将其作为纯粹的 Mockito 测试来执行,而无需@SpringBootTest。

最新更新