Как смоделировать возвращенный объект из внутреннего метода в другом классе в java - PullRequest
0 голосов
/ 01 мая 2020

Я прочитал по крайней мере 20 сообщений, но все еще не мог найти ответ. Итак, разместив этот вопрос. Может быть, это ответ в другом посте, который я не смог найти.

    class OuterService {
        InnerService innerService;
        @Autowired
        public void setInnerService(InnerService innerService){
            this.innerService = innerService;
        }
        public void method() {
            List<C> listOfC = new ArrayList<C>(); 
            C c =  new C();
            c.setUserProfiles(someObject);

            c = innerService.invokeMethod(String str1,Map map, 
            String str2, Object obj1, String str3, String str4, 
            C c, String str5); 


            c.setCreatedDate(some String value);  // Here c comes null while executing jUnits.
            listOfC.add(c);
        }
    }

Вот мой тестовый класс:

   import org.junit.Before;


    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.mockito.InjectMocks;
    import org.mockito.Matchers;
    import org.mockito.Mock;
    import org.mockito.Mockito;
    import org.mockito.MockitoAnnotations;
    import org.mockito.junit.MockitoJUnitRunner;
    import com.pogo.service.DeviceRegistrationService;

    @SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT")
    @SpringBootTest
    @RunWith(MockitoJUnitRunner.class)
    class ClassOuterServiceTest {

        @InjectMocks
        OuterService outerService;
        @Mock
        InnerService innerService;
        @Mock C c;

        @Before
        public void setUp() {
            MockitoAnnotations.initMocks(this);
            outerService.setInnerService(innerService);
        }

        @Test
        public void methodTest() {
        when(innerService.invokeMethod(Mockito.anyString(), 
        Mockito.any(Map.class), Mockito.anyString(),Mockito.anyString(), 
            Mockito.any(PersonSessionToken.class), Mockito.anyString(),Mockito.anyString(), Mockito.anyString(), 
            Mockito.any(RequestHeader.class),Mockito.any(C.class), 
            Mockito.anyString() )).thenReturn(c);


            doNothing().when(c).invokeCMethod();
            outerService.method();
        }
    }     

Но я получаю нулевое значение внутри объекта c в OuterService. java. Кроме того, если я использую Matchers.any () или Matchers.anyString () в invokeMethod (), тогда он показывает исключение Matchers.

Какое подходящее решение?

1 Ответ

0 голосов
/ 02 мая 2020

Вам не нужно создавать объект для OuterService, используйте @InjectMocks аннотацию, а при использовании метода-заглушки используйте только фиктивные объекты. В вашей программе вы создаете объект для c. Вместо создания объекта просто используйте аннотацию @Mock.

Когда вы используете Mockito.any(), укажите класс в скобках. Mockito.any(C.class) вот так.

Не используйте PowerMockRunner, если вы не тестируете stati c или заключительные классы.

@SpringBootTest
@RunWith(MockitoJUnitRunner.class)
public class ClassOuterServiceTestC {

    @Mock
    public InnerService innerService;
    @InjectMocks
    public OuterService outerService;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void methodTest() {

        C obj = mock(C.class);
        when(innerService.invokeMethod(anyString(), anyMap(), anyString(), any(), anyString(), anyString(), any(TestC.class), anyString()))
                .thenReturn(obj);
        doNothing().when(obj).setUserProfiles(any(Object.class));
        doNothing().when(obj).setCreatedDate(anyString());

        outerService.method();
    }

}


...