PowerMock没有使用正确的方法

时间:2019-04-08 15:05:50

标签: junit4 powermock

我面临一个奇怪的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调用,那么我将在第2行获得listNames而不是listPlaces。

为什么PowerMock会与方法混淆?或者在使用PowerMock时我还缺少其他东西。

2 个答案:

答案 0 :(得分:0)

我可以通过如下两次使用thenReturn来解决此问题

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

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

但是PowerMock为什么不能区分两种不同的方法调用returnNames()和returnPlaces()?

答案 1 :(得分:0)

一个不同的角度。这是这里:

@InjectMocks
private TestMe testMeMock;

那:

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

根本没有意义。

@InjectMocks注释旨在创建您的被测类的实例,该实例将通过您通过@Mock注释创建的其他模拟“填充”。但是随后您可以使用该受测类实例,就像它是模拟的一样(通过when(testMeMock.foo()))。

您应该先退后一步,然后自己弄清楚您打算做什么。可能是部分模拟,因为您想测试自己的init()方法,但同时也打算控制被测类上的其他方法。

最后,您可能还想退后一步,重新考虑您的总体设计。要让公共方法返回列表,也可以在执行初始化的公共方法上使用它,这听起来也很错误。