如何模拟春天的背景?

时间:2013-03-18 13:40:38

标签: java junit mockito powermock

private ServiceImpl() {
    // TODO Auto-generated constructor stub

    reMgr = (ReManager) SpringContext.getBean("reManager");

我想模拟这个方法,这是一个初始化springContext的私有构造函数。我正在使用beans.xml通过我的powermockito测试用例设置beanfactory,其中我已经指定了bean及其类名。仍然这种方法无法获得reManager的实例。

2 个答案:

答案 0 :(得分:2)

如果我误解了某些内容,请原谅我,但是如果你使用的是PowerMockito,你就不能做一些事情:

@RunWith(PowerMockRunner.class)
@PrepareForTest(SpringContext.class) 
public FooTest {    
    @Test
    public void foo() {
        final ReManager manager = Mockito.mock(ReManager.class);

        PowerMockito.mockStatic(SpringContext.class);
        Mockito.when(SpringContext.getBean("reManager")).thenReturn(manager);

        ... etc...
    }
}

有关如何验证静态行为的详情,请参阅here

或者......我会改变设计,以便将依赖关系传递给被测试的类,例如:

@Test
public void foo() {
    final ReManager manager = Mockito.mock(ReManager.class);
    final ServiceImpl service = new ServiceImpl(manager);

    ... etc...
}

然后不需要PowerMock,您的测试变得更容易,并且类之间的耦合更少。

答案 1 :(得分:1)

如果你想做的是在你的一个测试中创建一个Spring bean的实例,你不需要使用powermockito。你可以做这样的事情

@ContextConfiguration(locations = "/beans.xml")
public class YourTestJUnit4ContextTest extends  AbstractJUnit4SpringContextTests {

private ReManager reManager;

@Before
public void init() {
    reManager= (ReManager) applicationContext.getBean("reManager");
}

@Test
public void testReManager() {
    // Write here the code for what you wnat to test
}

}

beans.xml是您定义应用程序上下文的文件。我能想到的最好的链接就是这个

Spring Testing Support