I'm new to unit testing and try to understand how mocking works. I got the code as below, where I mock PdRequest.class
using PowerMockRunner
. However, it return Null
for all the variables. I also tried to set the value manually but its the same. Is there anything that I missing? and Is it better if I just create new PdRequest()
and set all the values manually?
What I tried
-Try to use @PrepareForTest
and @ExtendWith
-Try to put initMocks(this)
@RunWith(PowerMockRunner.class)
public class PerformanceServiceImplTest
PdRequest pdRequest = mock(PdRequest.class);
when(pdRequest.getLoginUserId()).thenReturn("42");
when(pdRequest.getYear()).thenReturn("Year");
doNothing().when(pdRequest).setLoginUserId((String) any());
doNothing().when(pdRequest).setCurrMetric((String) any());
doNothing().when(pdRequest).setCurrentLink((BreadCrumLink) any());
doNothing().when(pdRequest).setFullView((String) any());
doNothing().when(pdRequest).setManagerId((String) any());
doNothing().when(pdRequest).setMetric((String) any());
doNothing().when(pdRequest).setPdBoard((String) any());
doNothing().when(pdRequest).setRegionId((String) any());
doNothing().when(pdRequest).setRoleId((String) any());
doNothing().when(pdRequest).setRoleLevel((Integer) any());
doNothing().when(pdRequest).setRoleName((String) any());
doNothing().when(pdRequest).setSalesAbf((String) any());
doNothing().when(pdRequest).setSalesMm((String) any());
doNothing().when(pdRequest).setSalesRsme((String) any());
doNothing().when(pdRequest).setStaffId((String) any());
doNothing().when(pdRequest).setStaffIdList((List<String>) any());
doNothing().when(pdRequest).setTeamId((String) any());
doNothing().when(pdRequest).setYear((String) any());
pdRequest.setCurrMetric("Curr Metric");
pdRequest.setCurrentLink(breadCrumLink);
pdRequest.setFullView("Full View");
pdRequest.setLoginUserId("42");
pdRequest.setManagerId("42");
pdRequest.setMetric("Metric");
pdRequest.setPdBoard("Pd Board");
pdRequest.setRegionId("us-east-2");
pdRequest.setRoleId("42");
pdRequest.setRoleLevel(1);
pdRequest.setRoleName("Role Name");
pdRequest.setSalesAbf("Sales Abf");
pdRequest.setSalesMm("Sales Mm");
pdRequest.setSalesRsme("Sales Rsme");
pdRequest.setStaffId("42");
pdRequest.setStaffIdList(new ArrayList<>());
pdRequest.setTeamId("42");
pdRequest.setYear("Year");
CodePudding user response:
Ignore what IntelliJ is showing you. That shows you the state, which is inherited from the class you're mocking. However, you haven't set that state in the mock, and that state is not returned when any method is called. Instead, you've configured the Mockito internal fields (CGLIB$BOUND
etc.) to return those values.
CodePudding user response:
I found a way of getting the value. From https://www.toptal.com/java/a-guide-to-everyday-mockito .
PdRequest pdRequest = mock(PdRequest.class);
doAnswer(InvocationOnMock::callRealMethod).when(pdRequest).setLoginUserId("42");
doAnswer(InvocationOnMock::callRealMethod).when(pdRequest).getLoginUserId();
pdRequest.setLoginUserId("42");
assertEquals("42", pdRequest.getLoginUserId());