I had a UnitTest to create.
I wanted to check a bean class , with some logical code.
This bean class had an internal Autowired internal bean, that I didn't care of , didn't want to check .
So how to setup a test around the original class without having to setup the internal Autowired class ...
The @InjectMocks means that this is the main class that we want to test, where we inject into it, if possible , the other Mock.
The @Mock means that we want to wrap the class and to control it from outside , without taking care of its internal code.
Important:
do not forget the call
MockitoAnnotations.initMocks(this);
which activate the injection
Here is the example code :
mport org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.List; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.when;
public class ConsumerPrivateMessageConversationMessageDataConverterTest { @InjectMocks ConversationMessageDataConverter conversationMessageDataConverter = new ConversationMessageDataConverter(); @Mock UserACItemRetriever userACItemRetriever; @BeforeClass public void setMockOutput() throws AccountConfigClientException { MockitoAnnotations.initMocks(this); when(userACItemRetriever.getItem(anyString(), anyLong())).thenReturn(null); } @Test public void checkPrivateMessageFiltering() { conversationMessageDataConverter.convertToConversationHistoryMessageData(conversationDTO); } }
The ConversationMessageDataConverter class uses inside its code the UserACItemRetriever class
@Componentpublic class ConversationMessageDataConverter { @Autowired private UserACItemRetriever userACItemRetriever;public void convertToConversationHistoryMessageData( .... ) {}}
Adjustement:
17 Jan 2021 : I just paid attention that there's a difference between
@Mock and @MockBean
If you want your instance to be wrapped as a Mock but also considered
and injected as a bean, the, you should use:
@MockBean
Here for more info
https://stackoverflow.com/questions/42641853/spring-boot-integration-testing-with-mocked-services-components
No comments:
Post a Comment