基本上我想在干净的石板上运行测试,所以我不希望 @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/