[英]How to mock a static method from JMockit
I have a static method which will be invoking from test method in a class as bellow我有一个静态方法,它将从类中的测试方法调用,如下所示
public class MyClass
{
private static boolean mockMethod( String input )
{
boolean value;
//do something to value
return value;
}
public static boolean methodToTest()
{
boolean getVal = mockMethod( "input" );
//do something to getVal
return getVal;
}
}
I want to write a test case for method methodToTest by mocking mockMethod .我想通过模拟 mockMethod为方法methodToTest编写一个测试用例。 Tried as bellow and it doesn't give any output如下尝试,它没有给出任何输出
@Before
public void init()
{
Mockit.setUpMock( MyClass.class, MyClassMocked.class );
}
public static class MyClassMocked extends MockUp<MyClass>
{
@Mock
private static boolean mockMethod( String input )
{
return true;
}
}
@Test
public void testMethodToTest()
{
assertTrue( ( MyClass.methodToTest() );
}
To mock your static method:模拟你的静态方法:
new MockUp<MyClass>()
{
@Mock
boolean mockMethod( String input ) // no access modifier required
{
return true;
}
};
To mock the static private method:模拟静态私有方法:
@Mocked({"mockMethod"})
MyClass myClass;
String result;
@Before
public void init()
{
new Expectations(myClass)
{
{
invoke(MyClass.class, "mockMethod", anyString);
returns(result);
}
}
}
@Test
public void testMethodToTest()
{
result = "true"; // Replace result with what you want to test...
assertTrue( ( MyClass.methodToTest() );
}
From JavaDoc:来自 JavaDoc:
Object mockit.Invocations.invoke(Class methodOwner, String methodName, Object... methodArgs) Object mockit.Invocations.invoke(Class methodOwner, String methodName, Object... methodArgs)
Specifies an expected invocation to a given static method, with a given list of arguments.使用给定的参数列表指定对给定静态方法的预期调用。
There is another way of mocking static methods using JMockit (using Delegate class).还有另一种使用 JMockit(使用 Delegate 类)模拟静态方法的方法。 I find it more convenient and elegant.我觉得它更方便和优雅。
public class Service {
public String addSuffix(String str) { // method to be tested
return Utils.staticMethod(str);
}
}
public class Utils {
public static String staticMethod(String s) { // method to be mocked
String suffix = DatabaseManager.findSuffix("default_suffix");
return s.concat(suffix);
}
}
public class Test {
@Tested
Service service;
@Mocked
Utils utils; // @Mocked will make sure all methods will be mocked (including static methods)
@Test
public void test() {
new Expectations {{
Utils.staticMethod(anyString); times = 1; result = new Delegate() {
public static String staticMethod(String s) { // should have the same signature (method name and parameters) as Utils#staticMethod
return ""; // provide custom implementation for your Utils#staticMethod
}
}
}}
service.addSuffix("test_value");
new Verifications {{
String s;
Utils.staticMethod(s = withCapture()); times = 1;
assertEquals("test_value", s); // assert that Service#addSuffix propagated "test_value" to Utils#staticMethod
}}
}
}
Reference:参考:
https://jmockit.github.io/tutorial/Mocking.html#delegates https://jmockit.github.io/tutorial/Mocking.html#withCapture https://jmockit.github.io/tutorial/Mocking.html#delegates https://jmockit.github.io/tutorial/Mocking.html#withCapture
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.