Function 无法使用powermock easymock testng模拟静态函数(非maven项目)
首先告诉你,我试了又试,现在我需要一些帮助 这是我的密码Function 无法使用powermock easymock testng模拟静态函数(非maven项目),function,static,testng,easymock,powermock,Function,Static,Testng,Easymock,Powermock,首先告诉你,我试了又试,现在我需要一些帮助 这是我的密码 package staticPkg; public class Static { public static final String staticMethod() { System.out.println("Static method called"); return "Static called"; } } package staticPkg; public class TargetClass { Stati
package staticPkg;
public class Static {
public static final String staticMethod() {
System.out.println("Static method called");
return "Static called";
}
}
package staticPkg;
public class TargetClass {
Static staticClass;
public String callHere() {
return Static.staticMethod();
}
}
package staticPkg;
import org.easymock.EasyMock;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.testng.IObjectFactory;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.ObjectFactory;
import org.testng.annotations.Test;
@PrepareForTest({Static.class})
public class TestClass {
Static staticClass = null;
@ObjectFactory
public IObjectFactory getObjectFactory() {
System.out.println("got object factory");
return new org.powermock.modules.testng.PowerMockObjectFactory();
}
@BeforeMethod
public void setup() {
System.out.println("print me");
PowerMock.mockStatic(Static.class);
staticClass = PowerMock.createMock(Static.class);
}
@Test
public void testMe() {
EasyMock.expect(Static.staticMethod()).andReturn("Mock called").anyTimes();
PowerMock.replay(Static.class,staticClass);
TargetClass tc = new TargetClass();
String output = tc.callHere();
PowerMock.verify(Static.class,staticClass);
System.out.println(output);
}
}
[Parser]正在运行:
C:\MockWorkspace\Mock\temp-testng-customsuite.xml
got object factory
print me
Static method called
FAILED: testMe
java.lang.IllegalStateException: no last call on a mock available
at org.easymock.EasyMock.getControlForLastCall(EasyMock.java:521)
at org.easymock.EasyMock.expect(EasyMock.java:499)
at staticPkg.TestClass.testMe(TestClass.java:46)
... Removed 22 stack frames
===============================================
staticPkg.TestClass
Tests run: 1, Failures: 1, Skips: 0
===============================================
===============================================
Mock
Total tests run: 1, Failures: 1, Skips: 0
===============================================
目标工厂
打印我
静态方法调用
失败:testMe
java.lang.IllegalStateException:没有对模拟的最后调用可用
位于org.easymock.easymock.getControlForLastCall(easymock.java:521)
位于org.easymock.easymock.expect(easymock.java:499)
位于staticPkg.TestClass.testMe(TestClass.java:46)
... 移除了22个堆叠框架
===============================================
staticPkg.TestClass
测试运行:1,失败:1,跳过:0
===============================================
===============================================
嘲弄
运行的测试总数:1,失败:1,跳过:0
===============================================
请帮帮我,我已经尝试了各种各样的解决方案,但都做不到。
任何人都可以尝试此代码并更正它以获得成功吗?
我在EasyMock中得到错误。期望
在附近有工作吗
它是有效的
但是等等……我又被卡住了
我的测试用例在单独运行时运行良好,但在使用Ant运行时,会出现问题。可能是不同文件的其他测试用例相互干扰。
当我的单个测试用例使用@PrepareTest&easymock/powermock时,我也遇到了同样的错误
[testng]===============================静态呼叫===========================
[testng]javassist.CannotCompileException:by java.lang.LinkageError:loader(sun/misc/Launcher$AppClass的实例
Loader):尝试为名称复制类定义:“com/symantec/mobius/aggregator/submission/SubmissionFactory”
[testng]位于javassist.ClassPool.toClass(ClassPool.java:1085)
[testng]位于javassist.ClassPool.toClass(ClassPool.java:1028)
[testng]位于javassist.ClassPool.toClass(ClassPool.java:986)
[testng]位于javassist.CtClass.toClass(CtClass.java:1110)尝试从PowerMockTestCase扩展。TestNG支持也将在下一版本的PowerMock(1.4.9)中更新。尝试从PowerMockTestCase扩展。TestNG支持也将在下一版本的PowerMock(1.4.9)中更新。我也面临着同样的问题,并为此付出了很多努力。最后,我们找到了以下解决方案: 另一种选择是在testng suite.xml中将
对象工厂设置为org.powermock.modules.testng.PowerMockObjectFactory
。下面是一个示例套件文件:
<suite name="dgf" verbose="10" object-factory="org.powermock.modules.testng.PowerMockObjectFactory">
<test name="dgf">
<classes>
<class name="com.example.ClientTest"/>
</classes>
</test>
</suite>
当然,您也可以像Johan所说的那样从PowerMockTestCase扩展您的测试用例。我也面临着同样的问题,并且为此付出了很多努力。最后,我们找到了以下解决方案:
另一种选择是在testng suite.xml中将对象工厂设置为org.powermock.modules.testng.PowerMockObjectFactory
。下面是一个示例套件文件:
<suite name="dgf" verbose="10" object-factory="org.powermock.modules.testng.PowerMockObjectFactory">
<test name="dgf">
<classes>
<class name="com.example.ClientTest"/>
</classes>
</test>
</suite>
当然,您也可以根据Johan的建议从PowerMockTestCase扩展测试用例。在继续模拟静态方法之前,先模拟静态类中的所有静态方法。试试这个:
@Test
public void testMe() {
PowerMock.mockStatic(Static.class);
EasyMock.expect(Static.staticMethod()).andReturn("Mock called").anyTimes();
PowerMock.replay(Static.class,staticClass);
TargetClass tc = new TargetClass();
String output = tc.callHere();
PowerMock.verify(Static.class,staticClass);
System.out.println(output);
}
在继续模拟静态方法之前,先模拟静态类中的所有静态方法。试试这个:
@Test
public void testMe() {
PowerMock.mockStatic(Static.class);
EasyMock.expect(Static.staticMethod()).andReturn("Mock called").anyTimes();
PowerMock.replay(Static.class,staticClass);
TargetClass tc = new TargetClass();
String output = tc.callHere();
PowerMock.verify(Static.class,staticClass);
System.out.println(output);
}
嗨,Sunil,欢迎来到stack overflow。为便于将来参考,如果要粘贴XML或HTML(或任何其他代码/语言),请确保将其标记为代码(编辑器按钮或ctrl-K),否则它可能不可见。嗨,Sunil,欢迎使用堆栈溢出。为了便于将来参考,如果要粘贴XML或HTML(或任何其他代码/语言),请确保将其标记为代码(编辑器按钮或ctrl-K),否则它可能不可见。