我面临一个奇怪的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时我还缺少其他东西。
答案 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()
方法,但同时也打算控制被测类上的其他方法。
最后,您可能还想退后一步,重新考虑您的总体设计。要让公共方法返回列表,也可以在执行初始化的公共方法上使用它,这听起来也很错误。