我正在尝试为我的 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。