Spring Boot Mockito Sping Boot - JUnit测试用例

sd2nnvve  于 2023-04-20  发布在  Spring
关注(0)|答案(2)|浏览(195)

我正在尝试为应用程序的存储库类创建一个JUnit测试用例。
存储库如下:

@Repository
public interface AddressRepo extends JpaRepository<SourceAddress, int>, JpaSpecificationExecutor<SourceAddress> {

    @Query(value = "select * from Address ", nativeQuery = true)
    List<Address> getAdressResults();
}

实体类如下:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ADDRESS")
public class Address implements Serializable {
   
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false)
    private int id;

    @Column(name = "line1")
    private String line1;

    @Column(name = "line2")
    private String line2;
}

我尝试了以下方法,但它返回空指针异常,说明存储库为空:

@Mock
Repository repository;


@Test
public void testRepo(){
    Address address = new Address();
    address.setid(1));
    address.setLine1("address line 1");

    List<Address> addressList = new ArrayList<>();
    addressList.add(address);

    Mockito.when(repository.getAddressResults()).thenReturn(addressList);
    List<Address> addresses = repository.getAddressResults();
    assertThat(addresses.get(0).getLine1().equalsIgnoreCase("address line 1"));

}

如何测试此存储库?
谢谢

o8x7eapl

o8x7eapl1#

正如在评论中正确指出的那样--你在嘲笑你试图测试的类,这首先就违背了测试的整个想法。
有多种方法和哲学来进行测试,但是把哲学讨论放在一边,在测试存储库的情况下,你实际上要测试的是:
1.数据保存在所选的数据存储中,例如关系数据库。
1.对数据的查询是正确的,并返回预期值。
因此,具有测试对象的模拟示例没有意义。
话虽如此,如果你的环境允许,我会选择Testcontainers。它们的优点是,你可以针对你选择的DB的实际数据库进程测试你的代码。例如,假设你使用的是Postgres数据库,测试代码可能看起来像这样:

// imports and packaging omitted for brevity
@SpringBootTest(
  classes = {AddressRepo.class}
)
@Testcontainers
class AddressRepoTest {
  
  private static final PostgreSQLContainer<?> POSTGRES_SQL_CONTAINER =
      new PostgreSQLContainer<>("postgres:13.4");
  
  @BeforeAll
  static void setupContainer() {
    POSTGRES_SQL_CONTAINER.start();
  }

  @AfterAll
  static void cleanup() {
    POSTGRES_SQL_CONTAINER.stop();
  }

  @DynamicPropertySource
  static void springProperties(DynamicPropertyRegistry registry) {
    registry.add("spring.datasource.url", POSTGRES_SQL_CONTAINER::getJdbcUrl);
    registry.add("spring.datasource.username", POSTGRES_SQL_CONTAINER::getUsername);
    registry.add("spring.datasource.password", POSTGRES_SQL_CONTAINER::getPassword);
  }

  @Autowired
  private AddressRepository addressRepository;

  @Test
  public void testRepo(){
    // given  
    Address address = new Address();
    address.setid(1));
    address.setLine1("address line 1");
    addressRepository.save(address)

    // when
    List<Address> addresses = repository.getAddressResults();

    // then
    assertThat(addresses.get(0).getLine1().equalsIgnoreCase("address line 1"));
  }
}

上面的代码假设您在构建工具中设置了正确的依赖项,您可以在这里找到Testcontainer文档:https://www.testcontainers.org/

kb5ga3dv

kb5ga3dv2#

要测试repository,您可以使用带有注解@DataJpaTesttest slice。它允许您通过加载相关bean来测试应用程序的一部分。
在使用Spring进行测试时,您不必加载所有上下文。

相关问题