Easymock与Powermock错误

时间:2017-03-10 19:19:59

标签: junit powermock easymock

我正在使用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);
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

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

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

这里真的很棒:FileFactory可以轻松嘲笑。

所以不用需要PowerMock及其所有怪癖,你可以

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

答案 1 :(得分:0)

我解决了这个错误。

这是因为我和其他模仿一起嘲笑一个字符串。