mocikto- mocked сервис не возвращает true, всегда возвращает false - PullRequest
0 голосов
/ 01 сентября 2018

Код ниже (CallService.java) вызывает службу AService и выполняет некоторое обновление, а затем возвращает логическое значение.

    public boolean getUpdateStatus() throws ServiceException {
    if (finder == null) {
        finderBean = new FinderBean();
    }
    myService = finderBean.find(AService.class);
    if (myService == null) {
        System.out.println("null >>>>>>>");
    }

    final Config config = new Config();
    final Update update = new Update();
    status = myService.update(update, config);
    System.out.println("Status: " + status);
    return status;
}

И ниже тестовый пример проверяет CallService.java; Я высмеял все связанные с сервисом классы и вызвал мой тестируемый класс, чтобы вызвать AService и утвердить логическое значение, но mock всегда возвращает false независимо от насмешки.

@Before
public void setUp() throws Exception {

    myService = PowerMockito.mock(AService.class);
    finderBean = PowerMockito.mock(FinderBean.class);

    update = PowerMockito.mock(Update.class);
    config = PowerMockito.mock(Config.class);       
PowerMockito.whenNew(FinderBean.class).withNoArguments().thenReturn(finderBean);

PowerMockito.when(finderBean.find(AService.class)).thenReturn(myService);
}

@Test
public void TestUpdateState() throws Exception {

    callService = new CallService();
    MemberModifier.field(CallService.class, "finderBean").set(callService, finderBean);
    PowerMockito.when(finderBean.find(AService.class)).thenReturn(myService);
    PowerMockito.when(myService.update(update, config)).thenReturn(true);

    final boolean status = callService.getUpdateStatus();
    assertTrue(status);
}

Я что-то здесь упускаю, указатели?

Спасибо.

1 Ответ

0 голосов
/ 02 сентября 2018

Согласно документации

Все виды использования требуют @RunWith(PowerMockRunner.class) и @PrepareForTest с комментариями на уровне класса .

Использовать PowerMockito.whenNew, например,

whenNew(MyClass.class).withNoArguments().thenThrow(new IOException("error message"));

Обратите внимание, что вы должны подготовить класс, создающий новый экземпляр MyClass для теста, а не сам MyClass. Например. если класс, выполняющий new MyClass(), называется X, вам нужно будет выполнить @PrepareForTest(X.class), чтобы whenNew заработал:

упорная мина

Поэтому убедитесь, что у вас есть необходимые атрибуты и что зависимости соответствующим образом смоделированы

@RunWith(PowerMockRunner.class)
@PrepareForTest(CallService.class)
public class TestMyClass {
    FinderBean finderBean;
    AService myService;

    @Before
    public void setUp() throws Exception {        
        myService = PowerMockito.mock(AService.class);
        finderBean = PowerMockito.mock(FinderBean.class);
        PowerMockito.whenNew(FinderBean.class).withNoArguments().thenReturn(finderBean);            
    }

    @Test
    public void TestUpdateState() throws Exception {
        //Arrange                      
        PowerMockito.when(finderBean.find(AService.class)).thenReturn(myService);
        PowerMockito.when(myService.update(any(Update.class), any(Config.class))).thenReturn(true);
        CallService callService = new CallService(); 

        //Act
        final boolean status = callService.getUpdateStatus();

        //Assert
        assertTrue(status);
    }
}

Причина, по которой он ранее не работал с вашими фиктивными службами, заключалась в том, что аргументы в тесте не были одинаковыми аргументами в тестируемом методе. Тестируемый метод создавал свои собственные экземпляры локально, что означало бы, что они будут отличаться от экземпляров, используемых в настройках теста, и, как таковые, не будут работать так, как ожидалось при вызове.

...