Cant mock статические функции с powermock-easymock-testng (не maven проект) - PullRequest
0 голосов
/ 08 января 2011

Прежде всего, я попробовал и попробовал снова, и теперь мне нужна помощь

Вот мой код


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);

 }
}

And heres the log

[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
===============================================

Помогите, пожалуйста, я пробовал множество решений, не могу сделать это.Пожалуйста, кто-нибудь может попробовать этот код и исправить его для успеха?Я получаю сообщение об ошибке в EasyMock.expect ...............

Получил работу в http://blogs.bytecode.com.au/glen/2006/10/12/doing-bytecode-kungfu-with-javassist.html И это работает, но подождите .......... Я снова застрял Мой тестовый сценарий работает нормально, когда запускается один, но при запуске с Ant, это создает проблемы.Могут быть мешающие другие тестовые случаи разных файлов.Я получил ту же ошибку, когда мой индивидуальный тестовый случай использовал @PrepareTest & easymock / powermock

[testng] ========================== STATIC CALLED=========================== [testng] javassist.CannotCompileException: от java.lang.LinkageError: загрузчик (экземпляр 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)

Ответы [ 3 ]

1 голос
/ 08 февраля 2012

Я столкнулся с той же проблемой и много боролся.Наконец, нашли следующее решение:

Другой альтернативой является установка object-factory в org.powermock.modules.testng.PowerMockObjectFactory в TestNG suite.xml.Вот пример файла набора:

<suite name="dgf" verbose="10" object-factory="org.powermock.modules.testng.PowerMockObjectFactory">
    <test name="dgf">
        <classes>
            <class name="com.example.ClientTest"/>
        </classes>
    </test>
</suite>

Конечно, вы также можете расширить свой тестовый пример из PowerMockTestCase, как сказал Йохан.

1 голос
/ 11 апреля 2012

Смоделируйте все статические методы в статическом классе, прежде чем приступить к имитации статического метода. Попробуйте с этим:

@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);
 }
1 голос
/ 27 апреля 2011

Попробуйте расширить из PowerMockTestCase.Поддержка TestNG также будет обновлена ​​в следующей версии PowerMock (1.4.9).

...