我在模拟java DateFormat类。我必须测试的代码在线程中运行,但是DateFormat对象没有被模拟。System.out.println()
@Test public void test_1() { MyRunnable myRunnable =新的MyRunnable();myRunnable.run();}公共类MyRunnable实现可运行的{ public void (){ DateFormat格式化程序= Mockito.mock(DateFormat.class);MyClass myClass =新的MyClass();myClass.myMethod();}
public class MyClass {
public void myMethod() {
Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String timestamp = dateFormat.format(date);
System.out.println("value :" + timestamp);
}
}发布于 2021-04-09 10:22:56
如果要模拟MyClass中使用的日期格式化程序,则应使用依赖注入。
public class MyClass {
private final DateFormat dateFormat;
public MyClass(DateFormat dateFormat) {
this.dateFormat = dateFormat;
}
public MyClass() {
// Use default date format
dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
}
public void myMethod() {
Date date = new Date();
String timestamp = dateFormat.format(date);
System.out.println("value :" + timestamp);
}
}然后在测试代码中使用它,如下所示:
public void run(){
DateFormat formatter = Mockito.mock(DateFormat.class);
Mockito.when(formatter.format(any(Date.class), any(StringBuffer.class),
any(FieldPosition.class)))
.thenReturn(new StringBuffer("12345678"));
MyClass myClass = new MyClass(formatter);
myClass.myMethod();
}请注意,SimpleDateFormat并不是线程安全的,这意味着您应该在使用它的每个线程中创建一个新的MyClass实例(或者将格式化程序传递给myMethod()方法)。理想情况下,您应该将遗留的DateFormat类替换为来自java.time包的新类,这些类是线程安全的。
https://stackoverflow.com/questions/67018314
复制相似问题