2017-03-10 26 views
1

私はpowermockでeasymockを使用しています。私がthsiをテストしようとすると、エラーが発生します。powermockでeasymockエラー

java.lang.RuntimeException:PowerMockテストリスナー[email protected]でbeforeTestMethodメソッドを呼び出すことができませんでした。 java.lang.IllegalArgumentExceptionが:によって引き起こさ

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) 

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 

そして、私のクラスfinalクラスのクラスjava.lang.Stringのサブクラスを作成することはできません。このように見えます。

`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_d  ocready", "_Ready", (short) 0); 
    PowerMock.verify(File.class,workDir); 
    }` 
+0

で...をありがとうフルユニット・テストを行います受け入れてください! – GhostCat

答えて

1

ヒント:実際の問題は、生産コード内のすべての場所でnewを使用していることです。それはコードをテストするのが難しいを簡単に作成します。そして、あなたはPowerMockを探します。

また、簡単な

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

を作成し、クラス内のフィールドとしてそれを使用することができます。さて、特定の文字列のFileが必要な場合は、そのFileFactoryインスタンスを使用します。

本当にいいところは、FileFactoryを簡単に嘲笑できることです。

ので、代わりにPowerMockとそのすべての癖を必要とする、あなたは可能性があり

  1. あなたの設計を改善
  2. だけEasyMockまたはMockito
  3. のようなフレームワーク
0

私はこのエラーを解決しました。

私は他のモックと一緒に文字列を嘲笑していたために発生しました。

関連する問題