Junit 带有Powermock错误的Easymock

Junit 带有Powermock错误的Easymock,junit,powermock,easymock,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.Powe

我正在将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);
    }
}
我解决了这个错误


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

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

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

class FileFactory {
  File getFileFor(String fileName) { ...
并将其作为类内的字段。现在,当您需要某个字符串的文件时,可以使用该FileFactory实例

这里真正好的事情是:FileFactory很容易被嘲笑

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

  • 改进你的设计
  • 做完整的单元测试。。。仅使用EasyMock或Mockito之类的框架

  • 谢谢你的接受!