2013-01-22 43 views
4

我有一个问题嘲讽Calendar.getInstance()。正如你现在这个方法返回一个日历 - 我嘲笑的对象。PowerMocking静态不返回预期对象

现在我的代码如下所示:

@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()叫不同的时间,每次它是一个新的对象,而不是日历的预期模拟。

任何人都可以看到我做错了什么?

+3

In @PrepareForTest注释您必须将类使用静态模拟类,而不是静态模拟类。在你的情况应该是@PrepareForTest(Surveillance.class)而不是@PrepareForTest(Calendar.class)。 –

+1

@DominikKunicki将其转换为答案,这是正确的,只是测试... – Betlista

回答

0

看起来你正在做的一切都是正确的。例如,下面的测试通过了,证明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并评估它为什么失败。

0

我并不熟悉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 
    } 
} 
1

看来你需要添加目标测试类的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(); 
    } 
} 

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