Junit错误 - 没有值或没有这样的元素

时间:2018-03-28 10:59:48

标签: unit-testing spring-boot junit junit4 junit5

  

testclass.java

@Test
public void testgetDictionaryValueListById() {

    DictionaryValue dictionaryValue = new DictionaryValue();
    dictionaryValue.setId(1);
    dictionaryValue.setValueName("Test Dictionary Value");
    dictionaryValue.setValueKey("12345678");
    dictionaryValue.setStatus("Active");
    dictionaryValue.setCreatedOn(new Date());
    dictionaryValue.setUpdatedOn(new Date());

    Mockito.when(dictionaryValueRepo.findById(1).get()).thenReturn(dictionaryValue);
    assertThat(dictionaryService.getDictionaryValueListById(1)).isEqualTo(dictionaryValue);

}
  

Service.java

public DictionaryValue getDictionaryValueListById(int id) {
    return dictionaryValueRepo.findById(id).get();
}
  

Repo.java

@Repository
public interface DictionaryValueRepo extends JpaRepository<DictionaryValue, Integer> {

}

我在testclass.java中执行测试用例时一次又一次没有出现这样的值。我不知道为什么?但是当我从控制器运行我的服务方法时,它正在按预期工作 - 从数据库中提取记录但不在测试用例中工作。

2 个答案:

答案 0 :(得分:1)

您的测试应该是这样的,请查看命名。你需要在'get()。

中模拟步骤findId()
@InjectMocks
Service cut;

@Mock
DictionaryValueRepo dictionaryValueRepoMock;

// Can skipped by adding a @RunWith... on Testclass
@Before
public init() {
    Mockito.initMocks(this);
}

@Test
public void testgetDictionaryValueListById() {

    // Prepare Data
    final int testId = 1;
    DictionaryValue dictionaryValue = new DictionaryValue();
    dictionaryValue.setId(testId);
    dictionaryValue.setValueName("Test Dictionary Value");
    dictionaryValue.setValueKey("12345678");
    dictionaryValue.setStatus("Active");
    dictionaryValue.setCreatedOn(new Date());
    dictionaryValue.setUpdatedOn(new Date());

    // config mocking
    Mockito.when(dictionaryValueRepo.findById(testId)).thenReturn(<VALUE>);
    Mockito.when(dictionaryValueRepo.findById(testId).get()).thenReturn(dictionaryValue);

    // Call yout method for Testing
    cut.getDictionaryValueListById(testId);

    // verifies (if wanted) + assertions....
}

答案 1 :(得分:0)

我同意LenglBoy,所以应该给他正确的答案。

你需要小心的是&#34; VALUE&#34;意思是这一行:

  

Mockito.when(dictionaryValueRepo.findById(testId))thenReturn(VALUE);

findById返回一个Optional,这就是你应该构建并传递给Mockito的东西。像这样:

    Mockito.when(dictionaryValueRepo.findById(testId))
         .thenReturn(Optional.ofNullable(dictionaryValue));

对于BD中不存在id的场景,传递Optional.empty()应该足够了。