单身 class 没有被嘲笑
Singleton class not getting mocked
我有一个单例 class SvnPlugin,我需要将其 getInstance() 模拟为 return 一个模拟对象。但它不会被嘲笑。我正在使用 Powermock 和 Easymock。
以下是我的测试代码
@Test
@PrepareForTest({SVNPlugin.class})
public void createGlobalUSerTest() throws Exception{
PowerMock.mockStatic(SVNPlugin.class);
SVNPlugin svnPlugin=PowerMock.createMock(SVNPlugin.class);
PowerMock.expectNew(SVNPlugin.class).andReturn(svnPlugin);
EasyMock.expect(SVNPlugin.getInstance()).andReturn(svnPlugin).anyTimes();
EasyMock.expect(svnPlugin.getSynProject("", "", "", "")).andReturn(true);
PowerMock.replay(SVNPlugin.class,svnPlugin);
Future<RpcResult<CreateGlobalUserOutput>>
result=impl.createGlobalUser(getGLobalUser());
PowerMock.verify(svnPlugin,SVNPlugin.class);
Assert.assertNotNull(result);
}
需要mock的示例代码是
SVNPlugin svnplugin = SVNPlugin.getInstance();
checkOutFlg = svnplugin.getSynProject(checkOutLocationAtLocal, svnPath , userName, passWord);
我无法理解我做错了什么。
快速回答是您需要 Powermock 转轮。
那么,实际上你不需要模拟 new
因为模拟 getInstance
就足够了。
我假设 SVNPlugin
是最终的,这证明了使用 Powermock 创建的模拟是正确的。所以我尝试了这个实现。
public final class SVNPlugin {
public static SVNPlugin getInstance() {
return new SVNPlugin();
}
private SVNPlugin() {}
public boolean getSynProject(String s, String s1, String s2, String s3) {
return false;
}
}
下面的测试运行良好。
@RunWith(PowerMockRunner.class)
public class SVNPluginTest {
@Test
@PrepareForTest(SVNPlugin.class)
public void createGlobalUSerTest() throws Exception{
PowerMock.mockStatic(SVNPlugin.class);
SVNPlugin svnPlugin = PowerMock.createMock(SVNPlugin.class);
EasyMock.expect(SVNPlugin.getInstance()).andStubReturn(svnPlugin);
EasyMock.expect(svnPlugin.getSynProject("", "", "", "")).andReturn(true);
PowerMock.replay(SVNPlugin.class,svnPlugin);
SVNPlugin svnplugin = SVNPlugin.getInstance();
boolean checkOutFlg = svnplugin.getSynProject("", "", "", "");
assertTrue(checkOutFlg);
PowerMock.verify(svnPlugin,SVNPlugin.class);
}
}
我有一个单例 class SvnPlugin,我需要将其 getInstance() 模拟为 return 一个模拟对象。但它不会被嘲笑。我正在使用 Powermock 和 Easymock。
以下是我的测试代码
@Test
@PrepareForTest({SVNPlugin.class})
public void createGlobalUSerTest() throws Exception{
PowerMock.mockStatic(SVNPlugin.class);
SVNPlugin svnPlugin=PowerMock.createMock(SVNPlugin.class);
PowerMock.expectNew(SVNPlugin.class).andReturn(svnPlugin);
EasyMock.expect(SVNPlugin.getInstance()).andReturn(svnPlugin).anyTimes();
EasyMock.expect(svnPlugin.getSynProject("", "", "", "")).andReturn(true);
PowerMock.replay(SVNPlugin.class,svnPlugin);
Future<RpcResult<CreateGlobalUserOutput>>
result=impl.createGlobalUser(getGLobalUser());
PowerMock.verify(svnPlugin,SVNPlugin.class);
Assert.assertNotNull(result);
}
需要mock的示例代码是
SVNPlugin svnplugin = SVNPlugin.getInstance();
checkOutFlg = svnplugin.getSynProject(checkOutLocationAtLocal, svnPath , userName, passWord);
我无法理解我做错了什么。
快速回答是您需要 Powermock 转轮。
那么,实际上你不需要模拟 new
因为模拟 getInstance
就足够了。
我假设 SVNPlugin
是最终的,这证明了使用 Powermock 创建的模拟是正确的。所以我尝试了这个实现。
public final class SVNPlugin {
public static SVNPlugin getInstance() {
return new SVNPlugin();
}
private SVNPlugin() {}
public boolean getSynProject(String s, String s1, String s2, String s3) {
return false;
}
}
下面的测试运行良好。
@RunWith(PowerMockRunner.class)
public class SVNPluginTest {
@Test
@PrepareForTest(SVNPlugin.class)
public void createGlobalUSerTest() throws Exception{
PowerMock.mockStatic(SVNPlugin.class);
SVNPlugin svnPlugin = PowerMock.createMock(SVNPlugin.class);
EasyMock.expect(SVNPlugin.getInstance()).andStubReturn(svnPlugin);
EasyMock.expect(svnPlugin.getSynProject("", "", "", "")).andReturn(true);
PowerMock.replay(SVNPlugin.class,svnPlugin);
SVNPlugin svnplugin = SVNPlugin.getInstance();
boolean checkOutFlg = svnplugin.getSynProject("", "", "", "");
assertTrue(checkOutFlg);
PowerMock.verify(svnPlugin,SVNPlugin.class);
}
}