Как протестировать метод класса с аргументами конструктора с помощью Mockito / Powermock - PullRequest
0 голосов
/ 14 июля 2020

У меня проблема с Mockito / PowerMockito!

Класс для тестирования выглядит следующим образом:

public class ClassToTest {

    private String string;

    public ClassToTest(String s) {
        this.string = s;
    }

    public String concatenate() {
        return string.concat(" - Done!");
    }

    public ClassToTest create(String s) {
        return new ClassToTest(s);
    }
}

Тестовый класс, который я написал:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassToTest.class)
public class ClassToTestTest {

    @Test
    public void concatenate() throws Exception {
        ClassToTest classToTest = Mockito.mock(ClassToTest.class);
        PowerMockito.whenNew(ClassToTest.class).withArguments(Mockito.anyString()).thenReturn(classToTest);
        classToTest.concatenate();
    }
}

Вопрос - Как мне установить значение переменной экземпляра с именем «строка» из тестового класса, чтобы я мог протестировать метод конкатенации (метод конкатенации использует инициализированную конструктором «строковую» переменную). В настоящее время точка отладки даже не входит в конкатенацию () Мне нужно сделать это с помощью mockito / powermock.

Примечание. Приведенный мною пример представляет проблему, с которой я сталкиваюсь в реальном времени.

Любые потенциальные клиенты могут мне помочь .

Заранее спасибо !!

1 Ответ

1 голос
/ 14 июля 2020

Ваш тест бессмыслен по нескольким причинам.

  1. вы издеваетесь над классом, который пытаетесь протестировать
  2. вы издеваетесь над методом, который даже не вызывается в тесте
  3. вы не проверяете результат вызываемого метода.

Ваш тест может быть

ClassToTest tested = new ClassToTest("test"); // create instance
String concatResult = tested.concatenate();   // call method under test
assertThat(concatResult).isEqualTo("test - Done");  // verify result

Не нужно ничего имитировать. Если вы хотите протестировать метод create (в котором я вообще не вижу смысла, кстати), вы можете сделать

ClassToTest tested = new ClassToTest(""); // the String is never used anyway
ClassToTest created = tested.create("test"); // call method under test
assertThat(created.concatenate()).isEqualTo("test - Done"); // verify

Если вы имитируете классы, которые тестируете, вы не проверять поведение классов, но только фиктивный результат. Рассмотрим

Не делайте этого

ClassToTest mock = mock(ClassToTest.class);
ClassToTest other = mock(ClassToTest.class);
when(mock.create(anyString()).thenReturn(other);
when(other.concatenate(anyString()).thenReturn("expected");
ClassToTest created = mock.create("test");
String result = created.concatenate("lala");
assertThat(result).isEqualTo("expected"); // duh
...