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

SPRING @Value injection approaches - Easiest is ReflectionTestUtils.setField

@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());