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

标签 java unit-testing junit mockito

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

我在服务类中有一个私有(private)静态变量,它在构建成功后从存储库加载数据。有没有办法在没有这些数据的情况下运行单元测试? (有新类(class))

在测试中,我模拟了存储库的 getData 函数,但其​​中有一个 ifempty 语句。由于在构建时填充了静态变量,因此测试不会使用模拟函数,因此测试失败。

我发现有效的方法是在 @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);
}

最佳答案

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

您可以使用Reflections来做到这一点:link .

<小时/>

这可能有效,也可能无效,具体取决于您的 repo.findData() 调用是否有效或产生异常。我建议你不要在UnitTest中引入任何关于@PostConstruct注解的知识,这样该方法就不会被执行。

<小时/>

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

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

关于java - 如何在没有预设数据的情况下运行junit测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58936625/

相关文章:

java - 编写测试器类来测试编译后的文件

java - Android 为实用方法编写单元测试

java - 通过 ImmutableSet.copyOf() 和 new HashSet<>(list) 将列表转换为集合;

java - 对 CSVRecords 列表进行排序 (apache commons)

java - HTTP 传输错误 : javax.net.ssl.SSLHandshakeException

android - 由于主项目的复杂库项目依赖性,Jenkins-Server 上的自动化 Android UI 测试失败

java - 使用构造函数参数模拟嵌套类并测试方法

java - JScrollPane "jumping"当滚动条开始使用时

c# - CloudConfigurationManager.GetSetting 在单元测试中返回 Null

php - Laravel 和 Simpletest