spring 单元测试存储库保存不工作
spring unit test repository save not working
我正在尝试为我的 spring 服务器编写单元测试。
首先它会检查存储库中是否存在用户名,如果不存在则用户名可用,然后它将 return 为真,然后我将该用户名保存到我的存储库中并检查是否存在可用但不应该 return 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。
那么如何解决呢?
我认为测试 class 已正确注释:
@RunWith(SpringRunner.class)
@SpringBootTest
public class MainApplicationTests {
@Autowired
private LoginCredentialService loginCredentialService;
@MockBean
private LoginCredentialRepository loginCredentialRepository;
...
你用 H2 标记了 OP,所以我想你知道内存数据库。
如果您使用@SpringBootTest 注释,您正在编写集成测试,因此您将测试由Spring 连接的完整应用程序。为了提高效率,您可能希望使用内存数据库而不是完整的 SQL 服务器进行测试。
您可以通过将 H2 数据库添加为测试依赖项来实现此目的,Spring 集成测试存储库的启动将拾取它。然后你可以注入实际的存储库:
@Autowired
private LoginCredentialRepository loginCredentialRepository;
此外,您可以将测试设为@Transactional。那么每个测试用例都会运行在一个单独的事务中,每次测试后事务都会回滚,所以你不用担心交叉测试污染。
如果您只想对 LoginCredentialService 进行单元测试,则需要在存储库中存根相关方法,例如
@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。
我正在尝试为我的 spring 服务器编写单元测试。
首先它会检查存储库中是否存在用户名,如果不存在则用户名可用,然后它将 return 为真,然后我将该用户名保存到我的存储库中并检查是否存在可用但不应该 return 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。
那么如何解决呢?
我认为测试 class 已正确注释:
@RunWith(SpringRunner.class)
@SpringBootTest
public class MainApplicationTests {
@Autowired
private LoginCredentialService loginCredentialService;
@MockBean
private LoginCredentialRepository loginCredentialRepository;
...
你用 H2 标记了 OP,所以我想你知道内存数据库。
如果您使用@SpringBootTest 注释,您正在编写集成测试,因此您将测试由Spring 连接的完整应用程序。为了提高效率,您可能希望使用内存数据库而不是完整的 SQL 服务器进行测试。
您可以通过将 H2 数据库添加为测试依赖项来实现此目的,Spring 集成测试存储库的启动将拾取它。然后你可以注入实际的存储库:
@Autowired
private LoginCredentialRepository loginCredentialRepository;
此外,您可以将测试设为@Transactional。那么每个测试用例都会运行在一个单独的事务中,每次测试后事务都会回滚,所以你不用担心交叉测试污染。
如果您只想对 LoginCredentialService 进行单元测试,则需要在存储库中存根相关方法,例如
@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。