Значение объекта шпиона не изменяется с помощью then, затем Return - PullRequest
0 голосов
/ 21 декабря 2018
public class MainClass {
    public void method1() {
        …….
        String str = getMethod2();
        method3(str);
    }

    protected String getMethod2() {
        String str = “Actual Value”
        return str;
    }
    private void method3(String strparam) {
        …… 
    }
}

@RunWith(MockitoJunitRunner.class)
public class Testclass {
     @InjectMocks
     MainClass obj = new MainClass();

 ……
     @Test
    public void testSpy() {
        MainClass spyMain =  spy(obj);
        when(spyMain.getMethod2()).thenReturn(new String("Testing spy"));

        obj.method1(); 
        ……..
     }
}

Хотите использовать новое значение, возвращаемое из getMethod2 () из теста, так как оно будет передано method3.У меня сложилось впечатление, что вызов метода1 из тестового класса вызывает метод2, и я подумал, что значение, перенастроенное из метода2, - это «Тестовый шпион», но «Фактическое значение», а «Фактическое значение» передается методу 3 при запуске тестового класса.Как использовать новое значение из тестового класса?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Предполагая, что код в вашем примере на самом деле является кодом Java, а заглавная буква была добавлена ​​при копировании в Microsoft Word (или другой текстовый процессор), попробуйте следующее:

public void testSpy()
{
    MainClass spyMain = spy(obj);
    doReturn("Blammy").when(spyMain).getMethod2();

    obj.method1(); 
}

Вот еще некоторая информация:

  • Тестовый класс должен находиться в том же пакете, что и MainClass.Например:
    Местоположение MainClass: src / main / java / blammy / MainClass.java
    Местоположение TestClass: src / test / java / blammy / TestClass.java
  • Вариант doReturnmocking не вызывает обернутый метод, но вариант thenReturn делает.
  • Это неправильно:
    @InjectMocks
    MainClass obj = new MainClass();
    Используйте аннотацию @InjectMocks только есливы звоните MockitoAnnotations.initMocks(class).

Вот ваш тестовый класс, переписанный для использования @InjectMocks

@RunWith(MockitoJunitRunner.class)
public class Testclass
{
    @InjectMocks
    private MainClass classToTest;

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

    @Test
    public void testSpy()
    {
        spyClassToTest = spy(classToTest);
        doReturn("Testing spy").when(spyClassToTest ).getMethod2();

        spyClassToTest.method1(); 
    }
}

Дополнительные примечания:
Возможно, вы сможете использовать @Spy и @InjectMocks на одном и том же объекте (в моем примере на classToTest), но я никогда этого не делаю.

0 голосов
/ 21 декабря 2018

Вы вызываете метод для obj (obj.method1();), а не для объекта, который вы увидели: spyMain.method1();.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...