Mockito không thể chụp các phương thức tĩnh, nhưng vì Mockito 2.14.0, bạn có thể mô phỏng nó bằng cách tạo các thể hiện gọi của các phương thức tĩnh.
Ví dụ (trích từ các thử nghiệm của họ ):
public class StaticMockingExperimentTest extends TestBase {
Foo mock = Mockito.mock(Foo.class);
MockHandler handler = Mockito.mockingDetails(mock).getMockHandler();
Method staticMethod;
InvocationFactory.RealMethodBehavior realMethod = new InvocationFactory.RealMethodBehavior() {
@Override
public Object call() throws Throwable {
return null;
}
};
@Before
public void before() throws Throwable {
staticMethod = Foo.class.getDeclaredMethod("staticMethod", String.class);
}
@Test
public void verify_static_method() throws Throwable {
//register staticMethod call on mock
Invocation invocation = Mockito.framework().getInvocationFactory().createInvocation(mock, withSettings().build(Foo.class), staticMethod, realMethod,
"some arg");
handler.handle(invocation);
//verify staticMethod on mock
//Mockito cannot capture static methods so we will simulate this scenario in 3 steps:
//1. Call standard 'verify' method. Internally, it will add verificationMode to the thread local state.
// Effectively, we indicate to Mockito that right now we are about to verify a method call on this mock.
verify(mock);
//2. Create the invocation instance using the new public API
// Mockito cannot capture static methods but we can create an invocation instance of that static invocation
Invocation verification = Mockito.framework().getInvocationFactory().createInvocation(mock, withSettings().build(Foo.class), staticMethod, realMethod,
"some arg");
//3. Make Mockito handle the static method invocation
// Mockito will find verification mode in thread local state and will try verify the invocation
handler.handle(verification);
//verify zero times, method with different argument
verify(mock, times(0));
Invocation differentArg = Mockito.framework().getInvocationFactory().createInvocation(mock, withSettings().build(Foo.class), staticMethod, realMethod,
"different arg");
handler.handle(differentArg);
}
@Test
public void stubbing_static_method() throws Throwable {
//register staticMethod call on mock
Invocation invocation = Mockito.framework().getInvocationFactory().createInvocation(mock, withSettings().build(Foo.class), staticMethod, realMethod,
"foo");
handler.handle(invocation);
//register stubbing
when(null).thenReturn("hey");
//validate stubbed return value
assertEquals("hey", handler.handle(invocation));
assertEquals("hey", handler.handle(invocation));
//default null value is returned if invoked with different argument
Invocation differentArg = Mockito.framework().getInvocationFactory().createInvocation(mock, withSettings().build(Foo.class), staticMethod, realMethod,
"different arg");
assertEquals(null, handler.handle(differentArg));
}
static class Foo {
private final String arg;
public Foo(String arg) {
this.arg = arg;
}
public static String staticMethod(String arg) {
return "";
}
@Override
public String toString() {
return "foo:" + arg;
}
}
}
Mục tiêu của họ không phải là trực tiếp hỗ trợ chế độ tĩnh, mà là cải thiện các API công khai để các thư viện khác, như Powermockito , không phải dựa vào API nội bộ hoặc trực tiếp phải sao chép một số mã Mockito. ( nguồn )
Tuyên bố miễn trừ trách nhiệm: Nhóm Mockito nghĩ rằng con đường đến địa ngục được lát bằng các phương pháp tĩnh. Tuy nhiên, công việc của Mockito không phải là bảo vệ mã của bạn khỏi các phương thức tĩnh. Nếu bạn không thích nhóm của mình thực hiện chế độ tĩnh, hãy ngừng sử dụng Powermockito trong tổ chức của bạn. Mockito cần phát triển như một bộ công cụ với tầm nhìn đầy quan điểm về cách viết các bài kiểm tra Java (ví dụ: không giả định thống kê !!!). Tuy nhiên, Mockito không giáo điều. Chúng tôi không muốn chặn các trường hợp sử dụng không được khuyến nghị như chế độ tĩnh. Đó không phải là công việc của chúng tôi.