【问题标题】:How to mock a JPA Repository to use it for test with Junit?如何模拟 JPA 存储库以使用 Junit 进行测试?
【发布时间】:2019-08-31 17:38:53
【问题描述】:

修改后无法保存对象。

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

/* The method to be tested */
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);
}
        
/*The 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);

【问题讨论】:

  • 请坚持英文。 Stackoverflow 只有英文版

标签: java unit-testing spring-data-jpa mockito junit5


【解决方案1】:

当您使用 Junit5 时,请确保您的代码中有任何一个来初始化模拟:

@ExtendWith(MockitoExtension.class) on the test class

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

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

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

【讨论】:

  • 我在测试类上有@ExtendWith(MockitoExtension.class)
  • 好的,你检查过我的其他提示了吗?
  • 您好,对于手动注入模拟,不是这个“@Mock private RemRepository remRepository;”?
  • 不,这会创建模拟但不会注入它
猜你喜欢
  • 1970-01-01
  • 2018-07-30
  • 2015-06-23
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 2019-12-16
  • 2020-06-03
  • 1970-01-01
相关资源
最近更新 更多