【问题标题】:Mockito, mock and change Calendar.getIstance() [duplicate]Mockito,模拟和更改 Calendar.getIstance() [重复]
【发布时间】:2016-07-01 14:35:45
【问题描述】:

如何模拟和改变时间?

我在被测方法中使用 Calendar.getInstance()

这是方法

 public List<Object> chechAuth(){
    Calendar from = Calendar.getInstance();
    if(jobService.findJobByCheckAuth(from.getTime(), true).isEmpty()){
        from.add(Calendar.YEAR, -10);
    }
    Calendar to = Calendar.getInstance();
    to.add(Calendar.MONTH, 2);
    
    System.out.println("from: "+from.getTime());
    System.out.println("to: "+to.getTime()); 
    
    return objectDAO.findAuth(from.getTime(), to.getTime());
}

当我使用日历时 = Calendar.getInstance();它返回的日期与 2016 年 7 月 2 日不同

这是我的测试课:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Calendar.class, ImpServiceTest.class})    
public class ImpServiceTest {

@InjectMocks
private ImpService impService = new ImpServiceImpl();

@Before
public void setup(){
    MockitoAnnotations.initMocks(this);

    Calendar now = Calendar.getInstance();
    now.set(2016, Calendar.JULY, 2 ,0,0,0);
    
    PowerMockito.mockStatic(Calendar.class);
    PowerMockito.when(Calendar.getInstance()).thenReturn(now);
}

@Test
public void methodTEST() throws Exception {
    
     Calendar from = Calendar.getInstance();
     when(jobService.findJobByCheckAuth(eq(now.getTime()), eq(true))).thenReturn(new ArrayList<Job>());

     impService.chechAuth();
  }

这段代码打印

从:2006 年 9 月 2 日星期六 00:00:00 CEST

至:2006 年 9 月 2 日星期六 00:00:00 CEST

我希望第一个 Calendar.getInstance() 返回

2006 年 7 月 2 日星期日 00:00:00 CEST

第二个

2016 年 9 月 2 日星期五 00:00:00 CEST

一些建议?

【问题讨论】:

    标签: java spring calendar powermockito


    【解决方案1】:

    您应该使用以下内容注释测试类:

    @RunWith(PowerMockRunner.class)
    @PrepareForTest({Calendar.class, MyTest.class})
    

    MyTest 是带有测试的类的名称。 要使 powermockito 工作,您需要准备被模拟的类和目标类的测试。

    我不确定是否可以为测试类准备测试,所以如果它不起作用,请将日历代码移至其他类。

    【讨论】:

    • 不......它不起作用
    • 通常你还需要准备测试目标类,所以在这种情况下它是测试类名称。
    【解决方案2】:

    你可以这样做:

    @Test
    public void methodTEST() throws Exception {
    
    PowerMockito.mockStatic(Calendar.class);
    
        Calendar from = Calendar.getInstance();
    
       Date time = from.getTime();
    

    Mockito.when(Calendar.getInstance()).thenReturn(from);

    Mockito.when(from.getTime()).thenReturn(time);

        System.out.println(from.getTime());
    
        from.add(Calendar.YEAR, -1);
    
        System.out.println(Calendar.getInstance().getTime());
      }
    

    希望对您有所帮助。

    【讨论】:

    • Mon Jul 04 11:52:20 CEST 2016 Sat Jul 04 11:52:20 CEST 2015 这是你的测试结果,我想知道第二行是现在。
    • 但是你已经从1修改了,你能分享一下具体的要求吗
    • 我已经稍微修改了答案,你可以检查并确认它是否解决了目的
    • 我改变了我的问题...一些建议?我的目标是使用 Calendar.getInstance() 在 methodUnderTest 2 个不同的变量上使用,我想更改日期
    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多