hzdavid / jmockit.cn

JMockit中文网(jmockit.cn)上所有讲述的测试示例源代码
36 stars 15 forks source link

JMockit中文网交流社区,欢迎大家在这里交流JMockit相关问题 #1

Open hzdavid opened 6 years ago

hzdavid commented 6 years ago

如题。

kiddy2013 commented 6 years ago

请问怎么mock一个httpClient的返回值呢?本地一直提示,说HttpGet没有equals方法。

hzdavid commented 6 years ago

@kiddy2013

在junit/testng测试方法体中,

new MockUp<org.apache.http.client.methods.HttpGet>(){

   @Mock
    public  String getMethod(){
            //这里写,你想返回的内容
      }

};
153952402 commented 6 years ago

JNITools.loadNative() JNITools这个类是哪个jar中的。。

hzdavid commented 6 years ago

@153952402

https://github.com/hzdavid/jmockit.cn/blob/master/src/test/java/cn/jmockit/demos/utils/JNITools.java

153952402 commented 6 years ago

@hzdavid 非常感谢

hwhaocool commented 6 years ago

Deencapsulation.invoke() 方法没了 那现在怎么调用private方法呢

hzdavid commented 6 years ago

@hwhaocool 用反射。

`import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;

public class InvokePrivate {

public static class HelloWorld {

    private String sayHello() {
        return "HelloWorld";
    }
}

public static void main(String[] args)
        throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    HelloWorld helloworld = new HelloWorld();
    Method[] methods = HelloWorld.class.getDeclaredMethods();
    for (int i = 0; i < methods.length; i++) {
        Method m = methods[i];
        if (m.getName().equals("sayHello")) {
            m.setAccessible(true);
            System.out.println(m.invoke(helloworld, null));
        }
    }

}

} `

如果要mock private方法体,要借助MockUp 见http://jmockit.cn/showArticle.htm?channel=3&id=2

hbtj1216 commented 6 years ago

请问怎么mock一个返回值非void的super调用呢? class Parent { public String methodA() { return "A"; } }

class Child extends Parent { public String methodB() { // 调用super方法 String a = super.methodA(); return "B" + a; } } 我想测试Child的methodB()方法.

hzdavid commented 6 years ago

@hbtj1216

`public class ChildTest extends Parent { @Test public void methodBtest() { Child c = new Child(); Assert.assertTrue(c.methodB().equals("BA")); }

/**
 * 用MockUp & Mock,详情见 http://jmockit.cn/showArticle.htm?channel=3&id=2中的MockUp讲述
 */
@Test
public void methodBtest1() {
    class ParentMockUp extends MockUp<Parent> {
        @Mock
        public String methodA() {
            // 这里写MOCK逻辑,假设返回 "C"
            return "C";
        }
    }
    new ParentMockUp();
    Child c = new Child();
    Assert.assertTrue(c.methodB().equals("BC"));
}

/**
 * Expectations,详情见
 * http://jmockit.cn/showArticle.htm?channel=3&id=2中的Expectations讲述
 */
@Test
public void methodBtest2() {
    final Parent instanceToRecord = new Parent();
    new Expectations(Parent.class) {
        {
            instanceToRecord.methodA();
            result = "C";
        }
    };
    Child c = new Child();
    Assert.assertTrue(c.methodB().equals("BC"));
}`
chujianyun commented 6 years ago

文章通俗易懂,很不错,支持

dlt-1997 commented 6 years ago

请问如何实现多次调用返回不同的值,比如obj1.get()第一次调用,mock返回1,第二次调用,mock返回2... 以此类推

hzdavid commented 6 years ago

请问如何实现多次调用返回不同的值,比如obj1.get()第一次调用,mock返回1,第二次调用,mock返回2... 以此类推

@dlt-1997

用jmockit实在太方便了,见 http://www.jmockit.cn/showArticle.htm?channel=4&id=26

源代码也已上传。

zhetz commented 5 years ago

请问一下 我这边使用的时候遇到这个报错, 请问有解决办法吗? jmockit didn't get initialized; please check the -javaagent JVM initialization parameter was used

hzdavid commented 5 years ago

请问一下 我这边使用的时候遇到这个报错, 请问有解决办法吗? jmockit didn't get initialized; please check the -javaagent JVM initialization parameter was used

不要用jre,要用jdk.

superbaobei commented 5 years ago

参照 http://jmockit.cn/showArticle.htm?channel=3&id=2 的方法可以mock私有方法,但是我一个类A中方法1中多次调用私有方法2,每一次调用私有方法,我想返回不同的值应该怎么实现呢? `public class PrivateMethod {

public void method1() {

    if(isEnable(1)) {
        System.out.println("1");
    } else {
        System.out.println("2");
    }
    if(isEnable(2)) {
        System.out.println("3");
    } else {
        System.out.println("4");
    }
}

private boolean isEnable(int i) {//针对这个私有方法每次返回不同的值,mockup中好像每次都是相同结果
    if(i == 0) {
        return true;
    } else {
        return false;
    }
}

} `

hzdavid commented 5 years ago

@superbaobei

image

yeZh623 commented 5 years ago

java.lang.IllegalStateException: JMockit didn't get initialized; please check the -javaagent JVM initialization parameter was used.

yeZh623 commented 5 years ago

需要配置启动参数?

yexiangyang commented 4 years ago

测试类中有多个测试方法,每个方法都用了Expectations(.class)或者new MockUp()进行mock 测试类内部 执行单元测试没问题,通过maven test(maven-surefire-plugin)多线程执行会报错

xpgreat commented 4 years ago

想要在不同的testcase中mock相同的static method,需要返回不同的值,这个需要怎么实现呀,或者在每一个case执行完后如何进行恢复mock的动作,看很多都是使用Mockit。teardownMocks,但是版本jar中已经没有这个包了,求解答

Tbthr commented 10 months ago

在Base类中定义一个Mockup对象,并在 @BeforeClass 中进行 new,如下所示:

protected static DataMetaServiceMockup dataMetaServiceMockup;

@BeforeClass
  public static void initSQL() throws Exception {
      dataMetaServiceMockup = new DataMetaServiceMockup();
}

那么对于Base类的子类中的每个@Test,DataMetaServiceMockup是否会生效?

总之,对于 extends Mockup 的方式,其作用范围是什么?受什么影响?