Спок Power Mock не возвращает значение, указанное в методе .thenAnswer {} - PullRequest
0 голосов
/ 30 января 2020

У меня есть класс, у которого есть public static void метод. Этот метод использует метод другого класса, и этот метод принимает два аргумента и возвращает List значений.

public class FirstClass {
    public static void doSomething() {
        List<String> values = SecondClass.getOrderedValuesBy(anotherMethod());
        // action 
    }

    private static String anotherMethod() {
        // some action
        return ""; // something that depends on action above.
    }
}

public class SecondClass {
    public static List<String> getOrderedValuesBy(String by) {
        List<String> values = new ArrayList<>();
        values.addAll(getOrderedValuesBy(by, true));
        return values;
    }

    private static List<String> getOrderedValuesBy(String by, boolean ordered) {
       // some action
    }
}

Затем при написании некоторых тестов для этого я использую метод mockStatic на SecondClass и инициализируйте FirstClass как новый объект, как показано ниже.

def "someTest"() {
    given:
    mockStatic(SecondClass)
    FirstClass firstClass = new FirstClass()
    when(SecondClass.getOrderedValuesBy(anyString()).thenAnswer {['some values'])}
}

он не возвращает эти значения, которые я хотел бы получить, потому что они нужны мне в каком-то частном методе, который используется вызывается в doSomething() пустом методе и в качестве параметра этот метод принимает список values. У кого-нибудь есть идеи, что я делаю неправильно, и как я могу манипулировать значениями, возвращаемыми этим методом, вызываемым в методе void в FirstClass

1 Ответ

0 голосов
/ 31 января 2020

Вы можете использовать как thenReturn, так и thenAnswer, это зависит от того, что вы хотите сделать перед возвратом значения, как сказал @ Jordan . Вот MCVE :

Классы приложений:

package de.scrum_master.stackoverflow.q59993907;

import java.util.ArrayList;
import java.util.List;

public class SecondClass {
  public static List<String> getOrderedValuesBy(String by) {
    List<String> values = new ArrayList<>();
    values.addAll(getOrderedValuesBy(by, true));
    return values;
  }

  private static List<String> getOrderedValuesBy(String by, boolean ordered) {
    // some action
    List<String> result = new ArrayList<>();
    result.add("one");
    result.add("two");
    result.add("three");
    return result;
  }
}
package de.scrum_master.stackoverflow.q59993907;

import java.util.List;

public class FirstClass {
  public static void doSomething() {
    List<String> values = SecondClass.getOrderedValuesBy(anotherMethod());
    // action
    System.out.println(values);
  }

  private static String anotherMethod() {
    // some action
    return ""; // something that depends on action above.
  }
}

Спецификация Спока с использованием PowerMockito:

package de.scrum_master.stackoverflow.q59993907

import org.junit.runner.RunWith
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import org.powermock.modules.junit4.PowerMockRunnerDelegate
import org.spockframework.runtime.Sputnik
import spock.lang.Specification

import static de.scrum_master.stackoverflow.q59993907.SecondClass.getOrderedValuesBy
import static org.mockito.ArgumentMatchers.anyString
import static org.powermock.api.mockito.PowerMockito.mockStatic
import static org.powermock.api.mockito.PowerMockito.when

@RunWith(PowerMockRunner)
@PowerMockRunnerDelegate(Sputnik)
@PrepareForTest(SecondClass)
class PowerMockStaticTest extends Specification {
  static final PrintStream originalSysOut = System.out
  PrintStream mockSysOut = Mock()

  def setup() {
    System.out = mockSysOut
  }

  def cleanup() {
    System.out = originalSysOut
  }

  def "no mock"() {
    when:
    FirstClass.doSomething()

    then:
    1 * mockSysOut.println(['one', 'two', 'three'])
  }

  def "when-thenAnswer"() {
    given:
    mockStatic(SecondClass)
    when(getOrderedValuesBy(anyString())).thenAnswer { ['thenAnswer'] }

    when:
    FirstClass.doSomething()

    then:
    1 * mockSysOut.println(['thenAnswer'])
  }

  def "when-thenReturn"() {
    given:
    mockStatic(SecondClass)
    when(getOrderedValuesBy(anyString())).thenReturn(['thenReturn'])

    when:
    FirstClass.doSomething()

    then:
    1 * mockSysOut.println(['thenReturn'])
  }
}
...