【问题标题】:spring unit test repository save not working春季单元测试存储库保存不起作用
【发布时间】:2020-04-25 01:40:00
【问题描述】:

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

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

这是我的代码:

@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;
    ...

【问题讨论】:

  • 您的存储库是模拟的,因此它实际上不会在数据库中保存任何内容
  • @EamonScullion 用于测试目的我应该如何保存,暂时?
  • 去掉mock,注入真正的LoginCredentialRepository,但是你需要配置数据库,确保它运行等等。用mock进行单元测试实际上要好很多,你可以在验证(用Mockito)你的 loginCredentialRepository.save() 方法被调用的测试,这应该足以验证你的代码可以创建记录。
  • @MaifeeUlAsad 研究使用 H2(内存数据库)进行集成测试,您可以使用它来测试无需模拟的数据库交互

标签: spring spring-boot jpa testing h2


【解决方案1】:

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

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

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

@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。

【讨论】:

    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多