我在嘲笑Calendar.getInstance()时遇到了问题。正如您现在所看到的,此方法返回一个Calendar -我正在模拟的对象。
现在,我的代码如下所示:
@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()中被调用了很多次,每次它都是一个新对象,而不是预期的日历模拟。
有没有人看到我做错了什么?
发布于 2015-04-14 02:01:17
您似乎需要在PrepareForTest标记中添加目标测试类:
@PrepareForTest({ Calendar.class,Surveillance.class })
@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上面的例子也需要它。
发布于 2013-02-14 22:53:33
看起来你做的一切都是对的。例如,下面的测试通过了,证明Calendar#getInstance()返回的Calendar实际上就是您使用静态模拟设置的那个。
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的,并评估它失败的原因。
发布于 2013-04-23 02:10:59
我对when(object.call()).andReturn(response);不是很熟悉,但我假设它和expect.(object.call()).andReturn(response);的工作方式一样。如果是这样,那么看起来就像是缺少了类PowerMock.replay(Calendar.class)的重播,并且您正在尝试做一个完整的静态模拟,而不是部分静态模拟。这应该可以解决您的问题。
@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
}
}https://stackoverflow.com/questions/14456377
复制相似问题