我正在尝试为应用程序的存储库类创建一个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"));
}
如何测试此存储库?
谢谢
2条答案
按热度按时间o8x7eapl1#
正如在评论中正确指出的那样--你在嘲笑你试图测试的类,这首先就违背了测试的整个想法。
有多种方法和哲学来进行测试,但是把哲学讨论放在一边,在测试存储库的情况下,你实际上要测试的是:
1.数据保存在所选的数据存储中,例如关系数据库。
1.对数据的查询是正确的,并返回预期值。
因此,具有测试对象的模拟示例没有意义。
话虽如此,如果你的环境允许,我会选择Testcontainers。它们的优点是,你可以针对你选择的DB的实际数据库进程测试你的代码。例如,假设你使用的是Postgres数据库,测试代码可能看起来像这样:
上面的代码假设您在构建工具中设置了正确的依赖项,您可以在这里找到Testcontainer文档:https://www.testcontainers.org/。
kb5ga3dv2#
要测试repository,您可以使用带有注解
@DataJpaTest
的test slice。它允许您通过加载相关bean来测试应用程序的一部分。在使用Spring进行测试时,您不必加载所有上下文。