如何在没有预设数据的情况下运行junit测试

时间:2019-11-19 14:46:24

标签: java unit-testing junit mockito

基本上,我想在干净的面板上运行测试,所以我不想让@PostConstruct填充数据字段。

我在服务类中有一个私有静态变量,该变量在构建成功后会从存储库获取数据。有没有这种数据可以运行单元测试的方法吗? (有新鲜课堂)

在测试中,我正在模拟存储库的getData函数,但是其中有一个if empty语句。自从构建以来,就填充了静态变量,因此测试将不会使用模拟功能,因此测试将失败。

我发现有效的方法是在empty variable批注中调用服务的@Before函数。但这不是一个稳定的解决方案。

代码示例:

private static List<Data> data = Collections.synchronizedList(new ArrayList<Data>());

@PostConstruct
private List<Data> populateData() {

  data = repo.findData();

  return data;
}

public List<Data> getData() {

  if (data.size() == 0) {
    populateData();
  }
  return data;
}

测试:

@Mock
private Repository repo;

@Mock
private static Data data;

@InjectMocks
private Service service;

private List<Data> rows = new ArrayList<Data>();

@Before
public void mockMethodSetup() {

  //service.evictData();

  data.setValue(1);

  when(repo.findData()).thenReturn(data);

}

@Test
public void shouldReturnDataResponse() {
  List<Data> dataReturned= service.getData();
  assertEquals("Response was not equal to the mock.", dataReturned, data);
}

1 个答案:

答案 0 :(得分:1)

据我了解,您尝试用测试中的其他内容替换静态data字段。

您可以使用Reflectionslink来做到这一点。


此操作是否有效,取决于您的repo.findData()调用是起作用还是产生异常。我建议您不要将有关@PostConstruct批注的任何专门知识带到UnitTest中,这样就不会执行该方法。


此外,如果您为data定义@Mock,则需要为其定义行为。
请注意,data不应是测试中的静态字段。

Ps .: @InjectMocks对静态字段没有任何影响。