[英]mocking final class with junit fail
我正在嘗試使用Powermock在以下情況下編寫junit。 我嘗試編寫示例代碼,而不是復制不允許在此處發布的確切代碼。
class MainClass{
First.getC().setStr("abc");
}
final class First{
public static ClassC getC() {
return c;
}
}
class ClassC{
private String str;
//getter/setter for str
}
它總是失敗。 我的junit如下:
@RunWith(SpringJUnit4ClassRunner.class)
public class MainClassTest {
@Spy MainClass;
@Mock
private ClassC classc;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
PowerMockito.mockStatic(First.class);
}
@Test
public void myTest(){
when(First.getC()).thenReturn(classc);
Mockito.doCallRealMethod().when(classc).setStr(Mockito.any(String.class))
}
}
有關模擬靜態方法所需步驟的詳細說明 。
您錯過了關鍵
在測試用例的類級別使用@PrepareForTest(ClassThatContainsStaticMethod.class)批注。
除此之外:我認為它仍然行不通,因為第一步說:
在測試用例的類級別使用@RunWith(PowerMockRunner.class)批注。
這將阻止您使用SpringRunner。
因此,我的建議是: 忘記使用需要在測試用例中進行模擬的靜態方法。 請記住,無論如何, 靜態是良好OOP中的異常。 因此,不是在靜態方法中“修復”行為,而是在接口中表示功能。 最壞的情況是,您仍然可以在具有靜態“單例”實例的某些類中實現接口,然后將該實例傳遞給需要使用該接口的代碼。
因為這樣您可以使用普通的Mockito模擬該接口並傳遞模擬!
長話短說:您編寫了很難測試的代碼,迫使您考慮使用PowerMock-這將迫使您放棄Spring測試運行器-這會使您的生活變得困難10倍。 因此,更改代碼以使其易於測試,而無需考慮PowerMock。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.