如何解决要验证测试中的文件名,如何从 System.currentTimeMillis() 中获取模拟值,该值从类实例的方法中调用
当从 System.currentTimeMillis()
实例构造函数调用 generateFileName
方法时,我想模拟 MyClassImpl
方法以返回模拟值。
...
...
public class MyClassImpl {
private String myFileName;
public MyClassImpl() {
generateFileName();
}
public String getMyFileName() {
return myFileName;
}
private void generateFileName() {
myFileName = "Request" + System.currentTimeMillis();
}
}
...
...
@RunWith(PowerMockRunner.class)
@PrepareForTest(System.class)
@PowerMockIgnore({"javax.management.*"})
public class MyClassImplTest {
@Test
public void testForFileSave() throws Exception {
// Arrange
PowerMockito.mockStatic(System.class);
PowerMockito.when(System.currentTimeMillis()).thenReturn(123456789L);
System.out.println(System.currentTimeMillis() + " mocked current time");
// Act
MyClassImpl myclass = new MyClassImpl();
// Assert
assertThat(myclass.getMyFileName(),is("Request" + System.currentTimeMillis()));
}
}
测试响应
123456789 mocked current time
ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider jdk.nashorn.api.scripting.NashornScriptEngineFactory not a subtype
INFO 2021-03-05T07:45:32,390 org.eclipse.jetty.util.log [Test worker] Logging initialized @5103ms to org.eclipse.jetty.util.log.Slf4jLog
Expected: is "Request123456789"
but: was "Request1614930331383"
Expected :Request123456789
Actual :Request1614930331383
如何解决这个问题?
解决方法
将 System.currentTimeMillis()
放在单独的受保护方法中。在测试中创建一个测试类,它扩展 MyClassImpl
并覆盖受保护的方法,返回测试所需的任何内容。
public class MyClassImpl {
// ...
private void generateFileName() {
myFileName = "Request" + currentTimeMillis();
}
protected long currentTimeMillis() {
return System.currentTimeMillis();
}
}
public class MyClassMock extends MyClassImpl {
@Override
protected long currentTimeMillis() {
return 123456789L;
}
}
除了使用这个自定义模拟类之外,您还可以使用部分模拟(即 mockito 中的间谍)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。