基本上,我想在干净的面板上运行测试,所以我不想让@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);
}
答案 0 :(得分:1)
据我了解,您尝试用测试中的其他内容替换静态data
字段。
您可以使用Reflections
:link
来做到这一点。
此操作是否有效,取决于您的repo.findData()
调用是起作用还是产生异常。我建议您不要将有关@PostConstruct
批注的任何专门知识带到UnitTest中,这样就不会执行该方法。
此外,如果您为data
定义@Mock,则需要为其定义行为。
请注意,data
不应是测试中的静态字段。
Ps .:
@InjectMocks
对静态字段没有任何影响。