2016-08-18 64 views
0

我試圖單元測試在消費者功能接口中作爲回調運行的代碼。基於消費者功能接口的單元測試回調

@Component 
class SomeClass { 

    @Autowired 
    private SomeInteface toBeMockedDependency; 

    public method() { 
    toBeMockedDependency.doSomething(message -> { 
     // Logic under test goes here 
     //    (implements java.util.function.Consumer interface) 
     ... 
    }); 
    } 
} 

@RunWith(MockitoJUnitRunner.class) 
public class SomeClassTest { 
    @InjectMocks 
    private SomeClass someClass; 
    @Mock 
    private SomeInteface toBeMockedDependency; 

    @Test 
    public void testMethod() { 
    ... 
    someClass.method(); 
    ... 
    } 
} 

基本上我想要提供測試代碼的一些測試通過「toBeMockedDependency」,「信息」。

如何嘲笑「toBeMockedDependency」以提供預定義的消息?
這是正確的方法嗎?

+0

'message'從哪裏來?它是'SomeClass'的一個字段,method()的參數還是別的? – noscreenname

+0

在生產代碼中,依賴關係生成以下消息: 'toBeMockedDependency.doSomething(Consuner consumer){ ... String message =「... ..」;消息(message); ... }' – Boris

+0

你能否提供完整的代碼,告訴'consumer.accept(message)'何時被調用? – noscreenname

回答

1

不要試圖讓toBeMockedDependency自動調用您的功能界面。相反,使用@Captorcapture匿名函數接口,然後使用測試手動調用它。

@RunWith(MockitoJUnitRunner.class) 
public class SomeClassTest { 
    @InjectMocks 
    private SomeClass someClass; 
    @Mock 
    private SomeInteface toBeMockedDependency; 
    @Captor 
    private ArgumentCaptor<Consumer<Message>> messageConsumerCaptor; 

    @Test 
    public void testMethod() { 
    someClass.method(); 
    verify(toBeMockedDependency).doSomething(messageConsumerCaptor.capture()); 
    Consumer<Message> messageConsumer = messageConsumerCaptor.getValue(); 

    // Now you have your message consumer, so you can test it all you want. 
    messageConsumer.accept(new Message(...)); 
    assertEquals(...); 
    } 
}