如何模拟JPA Repository以使用它与Junit进行测试?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何模拟JPA Repository以使用它与Junit进行测试?相关的知识,希望对你有一定的参考价值。

修改后我无法保存到对象。

我正在将对象的属性设置为新值,当我想要保存时,我会收到NullPointerException

/* La méthode à tester */
public Rem afterInitRem(Rem rem) {

    /** Initialize regles with status MISSING **/
    List<Regle> regles = rem.getRegles();
    Regle regle = new Regle();
    regle.setCode("REGLE1");
    regle.setStatus(RegleStatus.MISSING);
    regles.add(regle);
    return remRepository.save(rem);
}

/*Le test*/
@Mock
private RemRepository remRepository;

@BeforeEach
void beforeEachTest() {
    rem = new Rem();
}

@AfterEach
void reInitVar() {
    beforeEachTest();
}

@Test
public void afterInitRemTest() {
    target.afterInitrem(rem);
    when(remRepository.save(any(Rem.class))).thenReturn(rem);
    ArgumentCaptor<Rem> argument = ArgumentCaptor.forClass(Rem.class);
    verify(regleRepository).save(argument.capture());

    assertEquals("REGLE1", argument.getValue().getRegles().get(0).getCode());
    assertEquals(RegleStatus.MISSING, argument.getValue().getRegles().get(0).getStatus());
    assertEquals(1, argument.getValue().getRegles().size());
}

我做调试,我看到通过的属性集,问题是在return remRepository.save(rem);的水平

答案

在使用Junit5时,请确保在代码中使用其中任何一个来初始化模拟:

@ExtendWith(MockitoExtension.class) on the test class

要么

@BeforeEach
void beforeEachTest() {
    MockitoAnnotations.initMocks(this);
    rem = new Rem();
}

此外,您需要确保手动注入模拟或使用@InjectMocks注释到SUT中。

最后,确保在调用实际的SUT方法之前完成所有模拟设置。

另一答案

谢谢@Maciej Kowalski,我添加了@InjectMocks注释,现在是测试工作。

以上是关于如何模拟JPA Repository以使用它与Junit进行测试?的主要内容,如果未能解决你的问题,请参考以下文章

EAGER 和分页:Spring MVC + JPA Repository + Hibernate

JPA 以SQL语句实现分页加模糊查询(参数可能为空)

如何使用 Spring Data JPA Repository 从 2 个表中查询?

删除分离实体spring jpa Repository接口

Spring Boot JPA Repository 未释放 Hikari DB Connection

spring data jpa使用repository进行查询,使用userRepository.getOne(id)和userRepository.findById(id)无法从数据库查询到数据