【问题标题】:Easymock with Powermock errorEasymock 与 Powermock 错误
【发布时间】:2017-03-10 19:19:59
【问题描述】:

我正在使用 Easymock 和 Powermock。当我尝试测试时,这是我得到的错误。

java.lang.RuntimeException: Invoking the beforeTestMethod method on PowerMock test listener org.powermock.api.extension.listener.AnnotationEnabler@959a1da3 failed.
    at org.powermock.tests.utils.impl.PowerMockTestNotifierImpl.notifyBeforeTestMethod(PowerMockTestNotifierImpl.java:95)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:298)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:288)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:208)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:147)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:121)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:123)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:121)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Caused by: java.lang.IllegalArgumentException: Cannot subclass final class class java.lang.String
    at org.easymock.cglib.proxy.Enhancer.generateClass(Enhancer.java:446)
    at org.easymock.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
    at org.easymock.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
    at org.easymock.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
    at org.easymock.cglib.proxy.Enhancer.createClass(Enhancer.java:317)
    at org.easymock.internal.ClassProxyFactory.createProxy(ClassProxyFactory.java:175)
    at org.easymock.internal.MocksControl.createMock(MocksControl.java:113)
    at org.easymock.internal.MocksControl.createMock(MocksControl.java:98)
    at org.easymock.EasyMock.mock(EasyMock.java:128)
    at org.easymock.EasyMock.createMock(EasyMock.java:259)
    at org.easymock.internal.Injector.createMocksForAnnotations(Injector.java:130)
    at org.easymock.internal.Injector.injectMocks(Injector.java:66)
    at org.easymock.EasyMockSupport.injectMocks(EasyMockSupport.java:528)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56)
    at java.lang.reflect.Method.invoke(Method.java:620)
    at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:1899)
    at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:801)
    at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:781)
    at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:466)
    at org.powermock.api.extension.listener.AnnotationEnabler.beforeTestMethod(AnnotationEnabler.java:71)
    at org.powermock.tests.utils.impl.PowerMockTestNotifierImpl.notifyBeforeTestMethod(PowerMockTestNotifierImpl.java:93)
    ... 24 more

我的班级看起来像这样。

public String renameOrDeleteDirectory(String Directory, String  dirExtn, (short) x){
    File workDir = new File(Directory);
    String OrigDir = null;
    File origDir =null;
    boolean renamed = false;
    try {
        if (null != Directory && Directory.length() > 0 ) {
            if(new File(Directory).list().length == 0){
                new File(Directory).delete();
                }

我的测试用例是这样的……

@RunWith(PowerMockRunner.class)
@PrepareForTest(value={Utilities.class, File.class})
public class dirTest1 {
    @Test
    public void testRenameOrDeleteDirectory1() throws Exception {
        mockStatic(File.class);

        expectNew(File.class, "C:\\Users\\Desktop\\Docs\\Docs2017_03_07_14_docready").andReturn(workDir);
        expect(workDir.list().length == 0).andReturn(true);
        expect(workDir.delete()).andReturn(true);
//      expect(null != Directory && Directory.length() >   0).andReturn(true);
//      expect(new File(Directory).list().length == 0).andReturn(true);
//      expect(new File(Directory).delete()).andReturn(true);
        PowerMock.replay(File.class, workDir);
        Utilities utilities = new Utilities();
        utilities.renameOrDeleteDirectory("C:\\Users\\Desktop\\Docs\\Docs2017_03_07_14_docready", "_Ready", (short) 0);
        PowerMock.verify(File.class, workDir);
    }
}

【问题讨论】:

  • 感谢您的接受!

标签: junit powermock easymock


【解决方案1】:

提示:您真正的问题是您在生产代码中到处使用new。这只会创建难以测试的代码。因此,您最终会寻找 PowerMock。

或者,您可以创建一个简单的

class FileFactory {
  File getFileFor(String fileName) { ...

并将其用作班级中的字段。现在,当您需要某个字符串的 File 时,您可以使用该 FileFactory 实例。

这里真正的好处是:FileFactory 可以很容易地被模拟。

因此,您不需要 PowerMock 及其所有怪癖,您可以

  1. 改进您的设计
  2. 进行完整的单元测试......只需使用 EasyMock 或 Mockito 等框架

【讨论】:

    【解决方案2】:

    我解决了这个错误。

    这是因为我正在模拟一个字符串和其他模拟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多