JMockit对方法体中new出来的对象mock以及对Spring RestTemplate类的mock操作

JMockit对方法体中new出来的对象mock以及对Spring RestTemplate类的mock操作

我们知道在Spring项目中用jmockit编写单元测试。对于sevice类中@Autowired的对象用@Injectable进行mock,然后在Expection中进行相应方法的mock,类似这样:

@RunWith(JMockit.class)
public class ATest{

@Tested
A a=new A();

@Injectable
private B b;

@Test
public void c(){
		new Expectations() {
            	{
            		b.methodA();
            		result="aaa";
            	}
            	};
		...
		a.c();
	}
}

对于方法c中new出来的对象以及Restemplate对象如何基于jmockit进行单测的编写呢?例如:

public class A{
	public String b(){
		RestTemplate restTemplate = new RestTemplate();
        	String resStr = restTemplate.getForObject("url", String.class, token);
        	JSONObject jsonObject = JSONObject.parseObject(resStr);
        	....
	}
}

jmockit单元测试如下:

@RunWith(JMockit.class)
public class ATest{

	@Tested
	A a=new A();

	@Test
	public void b(){
	RestTemplate restTemplate=new RestTemplate();
		new Expectations(RestTemplate.class){
	            {
             	    restTemplate.getForObject(anyString,(Class<T>)any,anyString);
            	    result="{'status':2,'data':{'phone':'18867112222'}}";
            	    result="{'status':1,'data':{'phone':'18867112222'}}";
           	 }
       	 };
	...
	a.b();
}
}

如果报类似如下异常:

java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/DefaultIndenter

at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.init(AbstractJackson2HttpMessageConverter.java:97)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.<init>(AbstractJackson2HttpMessageConverter.java:90)
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.<init>(MappingJackson2HttpMessageConverter.java:66)
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.<init>(MappingJackson2HttpMessageConverter.java:57)
at org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter.<init>(AllEncompassingFormHttpMessageConverter.java:61)
at org.springframework.web.client.RestTemplate.<init>(RestTemplate.java:159)
at com.zyhy.izms.service.impl.account.AccountServiceImplTest.xyrjLoginValidator(AccountServiceImplTest.java:326)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.core.util.DefaultIndenter
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
… 13 more

请在pom.xml中引入RestTemplate需要的jackson相关依赖。

	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-core</artifactId>
		<version>2.9.5</version>
	</dependency>
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-databind</artifactId>
		<version>2.9.5</version>
	</dependency>
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 JMockit 进行单元测试时,可以使用 `@Mocked` 注解来模拟方法内部创建的对象方法调用。当使用 `@Mocked` 注解对一个进行标注时,JMockit 会自动将该的所有实例都替换为模拟对象。 以下是一个示例代码,展示了如何使用 JMockit 来模拟方法内部创建对象方法调用: ```java import mockit.Expectations; import mockit.Mocked; public class MyClass { public void myMethod() { // 在方法内部创建对象 MyObject myObject = new MyObject(); String result = myObject.myMethod2(); System.out.println(result); } } public class MyObject { public String myMethod2() { return "Hello World"; } } public class MyClassTest { @Test public void testMyMethod(@Mocked MyObject mockedObject) { // 模拟 myMethod2() 方法的返回值 new Expectations() {{ mockedObject.myMethod2(); result = "Mocked Method"; }}; MyClass myClass = new MyClass(); myClass.myMethod(); // 输出 "Mocked Method" } } ``` 在上述示例中,我们使用 `@Mocked` 注解标注了 `MyObject` ,表示对该进行模拟。然后,在测试方法中,使用 `new Expectations()` 块来定义对模拟对象方法调用进行模拟。最后,创建 `MyClass` 的实例并调用 `myMethod()` 方法,可以看到输出的结果是模拟方法调用的返回值。 需要注意的是,当使用 `@Mocked` 注解对进行模拟时,所有的实例都会被替换为模拟对象,因此需要小心处理其他可能受影响的逻辑。另外,JMockit 还提供了其他的注解和功能来方便地进行单元测试,你可以参考 JMockit 的文档来了解更多用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值