首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerMocking static不返回预期的对象

PowerMocking static不返回预期的对象
EN

Stack Overflow用户
提问于 2013-01-22 18:27:56
回答 3查看 3K关注 0票数 4

我在嘲笑Calendar.getInstance()时遇到了问题。正如您现在所看到的,此方法返回一个Calendar -我正在模拟的对象。

现在,我的代码如下所示:

代码语言:javascript
复制
@RunWith(PowerMockRunner.class)
@PrepareForTest(Calendar.class)
public class SurveillanceDatabaseTest {
    @Test
    public void testFailingDatabase() throws Exception {
        mockStatic(Calendar.class);
        Calendar calendar = new GregorianCalendar();
        calendar.add(Calendar.HOUR, 1);
        when(Calendar.getInstance()).thenReturn(calendar);
        final Surveillance surveillance = new Surveillance();
        surveillance.checkDatabase();
   }
}

Calendar.getInstance()surveillance.checkDatabase()中被调用了很多次,每次它都是一个新对象,而不是预期的日历模拟。

有没有人看到我做错了什么?

EN

回答 3

Stack Overflow用户

发布于 2015-04-14 02:01:17

您似乎需要在PrepareForTest标记中添加目标测试类:

@PrepareForTest({ Calendar.class,Surveillance.class })

代码语言:javascript
复制
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Calendar.class, Surveillance.class })
public class SurveillanceDatabaseTest {
    @Test
    public void testFailingDatabase() throws Exception {
        mockStatic(Calendar.class);
        Calendar calendar = new GregorianCalendar();
        calendar.add(Calendar.HOUR, 1);
        when(Calendar.getInstance()).thenReturn(calendar);
        final Surveillance surveillance = new Surveillance();
        surveillance.checkDatabase();
   }
}

如果我们将Surveillance类移到MockCalendarTest类之外的某个地方,即使Tom Tresansky上面的例子也需要它。

票数 2
EN

Stack Overflow用户

发布于 2013-02-14 22:53:33

看起来你做的一切都是对的。例如,下面的测试通过了,证明Calendar#getInstance()返回的Calendar实际上就是您使用静态模拟设置的那个。

代码语言:javascript
复制
import static org.junit.Assert.*;
import static org.powermock.api.mockito.PowerMockito.*;

import java.util.Calendar;
import java.util.GregorianCalendar;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Calendar.class)
public class MockCalendarTest {
    @Test
    public void testFailingDatabase() {
        mockStatic(Calendar.class);

        final Calendar testCalendar = new GregorianCalendar();
        testCalendar.add(Calendar.HOUR, 1);
        when(Calendar.getInstance()).thenReturn(testCalendar);

        final Surveillance surveillance = new Surveillance();
        final Calendar resultCalendar = surveillance.checkDatabase();

        assertTrue(testCalendar == resultCalendar);
   }

    public static class Surveillance {
      public Calendar checkDatabase() {
        return Calendar.getInstance();
      }
    }
}

也许可以发布Surveillance类的相关部分,这样我们就可以看到它是如何尝试获取新的Calendar的,并评估它失败的原因。

票数 0
EN

Stack Overflow用户

发布于 2013-04-23 02:10:59

我对when(object.call()).andReturn(response);不是很熟悉,但我假设它和expect.(object.call()).andReturn(response);的工作方式一样。如果是这样,那么看起来就像是缺少了类PowerMock.replay(Calendar.class)的重播,并且您正在尝试做一个完整的静态模拟,而不是部分静态模拟。这应该可以解决您的问题。

代码语言:javascript
复制
@RunWith(PowerMockRunner.class)
@PrepareForTest(Calendar.class)
public class SurveillanceDatabaseTest {
    @Test
    public void testFailingDatabase() throws Exception {

        Calendar calendar = new GregorianCalendar();
        calendar.add(Calendar.HOUR, 1);

        PowerMock.mockStaticPartial(Calendar.class, "getInstance");  //Mock Static Partial
        expect(Calendar.getInstance()).andReturn(calendar);
        PowerMock.replay(Calendar.class);  // note the replay of the Class!

        final Surveillance surveillance = new Surveillance();
        surveillance.checkDatabase();

        //Whatever tests you need to do here
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14456377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档