jUnit Mockito - mosinn/DOCS-n-Snippets-n-Steps GitHub Wiki
Junit Mockito/Powermock Template
package myPackage;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.anz.commons.python.payment.api.rule.PaymentFact;
import com.anz.commons.python.payment.model.PaymentRequest;
import junit.framework.TestCase;
//@RunWith(MockitoJUnitRunner.class)
@RunWith(PowerMockRunner.class)
@PrepareForTest(value = {com.xxx.util.MyStaticMethodContainingUtil.class, class2.class})
`public class MyClassTest extends TestCase {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
SomeObjectToBeMocked injectedMock;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
SomeOtherObjectToBeMocked someMock;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
SomeOtherObjectToBeMocked anotherMock;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
SomeOtherObjectToBeMocked yetAnotherMock;
@Captor
ArgumentCaptor<SomeArgTypeToBeCapturedWhichIsPassedToAboveMockedObjectsMethodCall> requestArgumentCaptor;
@InjectMocks
private MyClassUnderTest myClassUnderTest;
@Test
public void testExecute() {
// Stub
Mockito.when(MyNONStaticMockitoMock.someMethod(any())).thenReturn(someMock);
PowerMockito.whenNew(MyStaticMethodUtil.class).withNoArguments().thenReturn(anotherMock);
PowerMockito.when(anotherMock.someMethod()).thenReturn(yetAnotherMock);
// Test
myClassUnderTest.doSomethingToTriggerTest();
// Assert
assertEquals("", "");
}
@Before
public void setup() throws Exception {
}
} `
If we expect method under test will throw and exception
@Test(expected = NameNotFoundException.class)
###Mockito Wiki: https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html
CHAINED METHODS testing
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- USeful for builder pattern, however, verification of only last method in chain is possible.
- traditional way is individual stubbing
- https://www.baeldung.com/mockito-fluent-apis
MVC
Spring Boot CONTROLLER jUnit4
Controller must be tested using
- @RunWith(SpringRunner.class)
- @SpringBootTest
- @AutoConfigureMockMvc
- ...class...
- @Autowire MockMvc mockMvc
DONT Mock everything eg POJOS, instead fill and use
- https://www.baeldung.com/java-faker
- http://mtedone.github.io/podam/
- https://github.com/j-easy/easy-random
SPRING @Value injection approaches - Easiest is ReflectionTestUtils.setField
- https://stackoverflow.com/questions/17353327/populating-spring-value-during-unit-test
- ReflectionTestUtils.setField (No SpringBoot test runner needed and no config creation needed)
- Non Spring Boot Spring
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = FooTest.Config.class)
@TestPropertySource(properties = {
"some.bar.value=testValue",
})
public class FooTest {
@Value("${some.bar.value}")
String bar;
@Test
public void testValueSetup() {
assertEquals("testValue", bar);
}
@Configuration
static class Config {
`@Bean`
`public static PropertySourcesPlaceholderConfigurer propertiesResolver() {`
`return new PropertySourcesPlaceholderConfigurer();`
`}`
}
}
- OR In case of SpringBoot we have following code
@SpringBootTest
@SpringBootConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = {
"some.bar.value=testValue",
})
public class FooTest {
@Value("${some.bar.value}")
String bar;
@Test
public void testValueSetup() {
assertEquals("testValue", bar);
}
}
Some scenario where impossible to use mockito, like new object created inside private method, and by default, say we need that to return "our" data when interacted with in subsequent lines
https://newbedev.com/mocking-a-private-variable-that-is-assumed-to-exist
PowerMockito.whenNew(Foo.class).withNoArguments().thenReturn(foo);
Mock Private Method inside a Static Class
https://stackoverflow.com/questions/25594090/how-can-i-mock-private-static-method-with-powermockito
PowerMockito.spy(MyStaticClass.class); doReturn(true).when(MyStaticClass.class, "myPRIVATEMethod", anyString(), anyInt());