2017-05-25 53 views
1

我有一個類是最終的,它有一個我想要執行某些操作的方法。正因爲如此,我想創建最終課程的對象。但我無法創建它,下面是我的課程。在Java中使用mockito庫模擬最終的類

public final class A { 

    private String name; 

    A(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 
} 

在我的JUnit測試情況下,我想創建一個類的對象,像下面

Class TestA{ 

     @Test 
     public void testA(){ 
      A a = mock(A.class); 

      when(a.getName()).then("ABC"); //on this line i am getting exception 
     } 
} 

我以新的關鍵字也有,但是沒有工作嘗試過。那麼無論如何要創建一個最終課程的模擬對象?

繼例外,我面對的,

org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy class A 
Mockito cannot mock/spy following: 
    - final classes 
    - anonymous classes 
    - primitive types 
    at com.rocket.map.resources.TestA.testA(TestA.java:46) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
+0

爲什麼你需要嘲笑那個班?你爲什麼不使用它? – tddmonkey

+0

爲什麼要嘲笑它?爲什麼不直接用名稱'「ABC」'實例化? – khelwood

+0

在實例化模擬庫上拋出異常。 –

回答

3

嘗試使用此。

Use the @RunWith(PowerMockRunner.class) annotation at the class-level of the test case. 
Use the @PrepareForTest(ClassWithFinal.class) annotation at the class-level of the test case. 
Use PowerMock.createMock(ClassWithFinal.class) to create a mock object for all methods of this class (let's call it mockObject). 
Use PowerMock.replay(mockObject) to change the mock object to replay mode. 
Use PowerMock.verify(mockObject) to change the mock object to verify mode. 

也可參考此答案 - link

而且Tutorial

兩者看起來都很容易實現。

1

這是不可能的V1的Mockito請 看看這個link。我認爲在預先版本或powermockito你可以做到這一點。Powermockito example

+1

當推薦Powermock時,應該總是添加Powermock與字節碼混淆的一小部分信息。 – Turing85