2016-11-18 80 views
0

我想執行一個junit測試使用Mockito對toEntity函數。如何使用Mockito JUNIT一個java.util.Function

@Component 
    public class MyEntityTransform { 
     public Function<MyDTO , MyEntity> toEntity = new Function<MyDTO , MyEntity >() { 
      @Override 
      public MyEntity apply(MyDTO record) { 
       return new MyEntity(); 
      } 
     }; 
    } 

不幸的是,toEntityNULL當我嘲笑類,我不知道我怎樣才能正確地進行測試。

@RunWith(MockitoJUnitRunner.class) 
public class MyTest { 

    @InjectMocks 
    private MyService _classUnderTest; 

    @Mock 
    private MyEntityTransform myEntityTransform 

    @Before 
    public void setUp() { 
     Mockito.when(this.myEntityTransform.toEntity.apply(Mockito.anyObject())).thenReturn(...); 
    } 
} 

當我運行JUnit測試,給的Mockito我的錯誤:

顯示java.lang.NullPointerException org.mockito.exceptions.misusing.InvalidUseOfMatchersException:這裏檢測 錯位的參數匹配:

- >在com.example.MyTest.setUp(MyTest.java:38)

無法使用驗證或ST的外參數匹配器ubbing。 正確使用參數匹配器的示例: when(mock.get(anyInt()))。thenReturn(null); doThrow(new RuntimeException())。when(mock).someVoidMethod(anyObject()); 驗證(模擬).someMethod(包含(「富」))

而且,這個錯誤可能會顯示出來,因爲你使用參數的匹配與 方法不能被嘲笑。以下方法不能爲 存根/驗證:final/private/equals()/ hashCode()。不支持在非公共父類上聲明的模擬方法 。

你有什麼建議嗎?

+2

在這裏絕對沒有理由使用模擬。當測試使用B的A時,使用嘲諷來爲A提供假B。嘲笑你正在測試的東西沒有意義。 –

+0

我不明白。如果你想測試'Function'爲什麼涉及到'Mockito'? –

+0

對不起,我想在另一個測試中使用函數toEntity作爲模擬。 –

回答

4

您正在使用公共字段,這不是一個好主意。但無論如何,你想要模擬的是函數,而不是MyEntityTransform的實例。所以你需要類似

@InjectMocks 
private MyService _classUnderTest; 

@Mock // or @Spy 
private MyEntityTransform myEntityTransform; 

@Before 
public void prepare() { 
    myEntityTransform.toEntity = mock(Function.class); 
} 

但坦率地說,我不會使用類型爲Function的公共字段。相反,我會用一個公共方法:

public class MyEntityTransform { 
    public MyEntity toEntity(MyDTO record) { 
     return new MyEntity(); 
    } 
} 

然後你可以嘲笑MyEntityTransform並使其toEntity方法返回你想要什麼。如果你需要通過一個函數來執行該方法,請使用方法參考:

collection.stream().map(myEntityTranform::toEntity) 
+0

謝謝!你幫我意識到我的錯誤。 –