PowerMock не заглушает правильный метод - PullRequest
1 голос
/ 08 апреля 2019

У меня странная проблема с PowerMock. Позвольте мне объяснить более подробно.

Мой код:

@Service 
public class TestMe {

  @Autowired
  private ClassA  a;

  @Autowired
  private ClassB  b;

  @Autowired
  private ClassStatic  staticClass;

  public void init(){
       List<String> nameList = returnNames(); // Line#1
       // Work with names 

       List<String> placeList = returnPlaces(); // Line#2
       // Work with places 
  }


  public List<String> returnNames(){
      // Code to return list of names
  }

  public List<String> returnPlaces(){
      // Code to return list of places
  }

}

Мой тестовый класс

 @RunWith(PowerMockRunner.class)
 @PrepareForTest({ClassStatic.class})
 public class TestMeTest {

 @Mock
 private ClassA  aMock;

 @Mock
 private ClassB  bMock;

 @InjectMocks
 private TestMe testMeMock;

 @Test
 public void testInit(){
     List<String> listNames = ... // some list of names 
     List<String> listPlaces = ... // some list of places

     when(testMeMock.returnNames()).thenReturn(listNames);

    // listPlaces gets returned in Line#1 shown in the main code.
     when(testMeMock.returnPlaces()).thenReturn(listPlaces); 
     testMeMock.init();
 }

}

Итак, как вы видите в строке # 1, я получаю listPlaces вместо listNames. Если я переставлю вызовы when, то получу listNames вместо listPlaces в строке # 2.

Почему PowerMock путает с методами? Или я что-то упускаю при работе с PowerMock.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Другая точка зрения. Это здесь:

@InjectMocks
private TestMe testMeMock;

и это:

when(testMeMock.returnPlaces()).thenReturn(listPlaces); 

просто не имеет смысла вместе.

Аннотация @InjectMocks предназначена для создания экземпляра тестируемого вами класса , который "заполняется" другими имитаторами, созданными вами с помощью аннотации @Mock. Но затем вы используете этот тестируемый экземпляр класса , как будто это было фиктивно (переходя на when(testMeMock.foo())).

Вы должны начать с шага назад и прояснить для себя, что именно вы намереваетесь сделать. Вероятно, частичная насмешка, потому что вы хотите проверить свой метод init(), но вы также намереваетесь контролировать, что делают другие методы в тестируемом классе.

Наконец, вы также можете отступить и пересмотреть свой общий дизайн. Иметь открытые методы, возвращающие списки, которые также используются в открытом методе, который выполняет init, что тоже просто звучит неправильно.

0 голосов
/ 08 апреля 2019

Я мог бы решить эту проблему, используя thenReturn дважды, как показано ниже

when(testMeMock.returnNames()).thenReturn(listNames).thenReturn(listPlaces); 

// Removed the returnPlaces() call 
// when(testMeMock.returnPlaces()).thenReturn(listPlaces); 
 testMeMock.init();

Но почему PowerMock не может различить два разных вызова методов returnNames () и returnPlaces () ??

...