返回信息流楼主最近写java测试代码,在用java反射测试私有方法的时候遇到了有关传参的问题.
还请我邮大神帮忙解决下:
public class DataBrokerAdapterTest extends TestCase {
private DataBrokerAdapter dataBrokerAdapter;
private DataBroker dataBroker;
@Before
public void setUp() throws Exception {
dataBroker = mock(DataBroker.class);
dataBrokerAdapter = new DataBrokerAdapter(dataBroker);
}
@Test
public void testAddPhysicalHost() throws Exception {
PhysicalHostKey physicalHostKey = mock(PhysicalHostKey.class);
Class<DataBrokerAdapter> class1 = DataBrokerAdapter.class;
Method method = class1.getDeclaredMethod("getPhysicalHostIdentifier", new Class[]{PhysicalHostKey.class});
method.setAccessible(true);
Object result = method.invoke(dataBrokerAdapter,new Object[]{physicalHostKey});
}
现在PhysicalHostKey类是yang文件编译后生成的类,也就是说在compile之前是没有的. 目前报错主要是
Object result = method.invoke(dataBrokerAdapter,new Object[]{physicalHostKey});中physicalHostKey对象不是object类型对象,传参会出错....向问问大家该怎么办???
先行谢过~
这是一条镜像帖。来源:北邮人论坛 / java / #45928同步于 2015/11/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
java测试中反射问题
menmencqupt
2015/11/30镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
public Object invoke(Object obj, Object... args)
这个是个vararg函数,你直接调用method.invoke(dataBrokerAdapter, physicalHostKey)就行了。
另外,不知道你的那个getPhysicalHostIdentifier的函数签名是什么样的。这决定了你应该如何调用。
private InstanceIdentifier<PhysicalHost> getPhysicalHostIdentifier(PhysicalHostKey physicalHostKey)
直接调用method.invoke(dataBrokerAdapter, physicalHostKey)会出错,IDE会提示要Object类,编译后控制台提示InvocationTarget
【 在 nuanyangyang 的大作中提到: 】
: public Object invoke(Object obj, Object... args)
: 这个是个vararg函数,你直接调用method.invoke(dataBrokerAdapter, physicalHostKey)就行了。
: 另外,不知道你的那个getPhysicalHostIdentifier的函数签名是什么样的。这决定了你应该如何调用。
【 在 menmencqupt 的大作中提到: 】
: private InstanceIdentifier<PhysicalHost> getPhysicalHostIdentifier(PhysicalHostKey physicalHostKey)
: 直接调用method.invoke(dataBrokerAdapter, physicalHostKey)会出错,IDE会提示要Object类,编译后控制台提示InvocationTarget
:
我这个程序没有什么问题。如果可能的话,你可以贴更详细的代码,以及错误提示,我帮你看看。
package cn.byr.nuanyangyang.cljunk;
import static org.junit.Assert.assertEquals;
import java.lang.reflect.Method;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
public class CommonsLangTest {
@Test
public void testStringConcat() {
String s1 = "Hello world";
int len = StringUtils.length(s1);
assertEquals(11, len);
}
@Test
public void testStringConcatReflect() throws Exception {
String s1 = "Hello world";
Method m = StringUtils.class.getMethod("length", CharSequence.class);
Integer len = (Integer) m.invoke(null, s1);
assertEquals(11, len.intValue());
}
}
这是源码
private IpAddress generateDefaultGatewayIpAddress(String ipPrefix) {
int indexOfSlash = ipPrefix.indexOf('/');
String strIpAddress = ipPrefix.substring(0, indexOfSlash);
int mask = Integer.parseInt(ipPrefix.substring(indexOfSlash + 1));
String[] segments = strIpAddress.split("\\.");
int intIpAddress = (Integer.parseInt(segments[0]) << 24) | (Integer.parseInt(segments[1]) << 16);
intIpAddress |= (Integer.parseInt(segments[2]) << 8) | (Integer.parseInt(segments[3]));
int intGatewayIpAddress = ((intIpAddress >> (32 - mask)) << (32 - mask)) + 1;
String strGatewayIpAddress = ((intGatewayIpAddress >> 24) & 0xff) + "." +
((intGatewayIpAddress >> 16) & 0xff) + "." +
((intGatewayIpAddress >> 8) & 0xff) + "." +
(intGatewayIpAddress & 0xff);
return new IpAddress(new Ipv4Address(strGatewayIpAddress));
}
private byte[] convertMacAddressToByteArray6(MacAddress macAddress) {
byte[] byteArray = new byte[6];
String[] segments = macAddress.getValue().split(":");
for ( int i = 0; i < 6; i++ ) {
byteArray[i] = (byte)Integer.parseInt(segments[i], 16);
}
return byteArray;
}
这是我写的测试代码:
public void testPrivateMethod() throws Exception{
Class<FlowUtils> class1 = FlowUtils.class;
//test generateDefaultGatewayIpAddress
String ipPrefix = new String("192.168.1.1/16");
IpAddress ipAddress;
Method method = class1.getDeclaredMethod("generateDefaultGatewayIpAddress", new Class[]{String.class});
method.setAccessible(true);
Object obj = method.invoke(flowUtils,new Object[]{ipPrefix});
Assert.assertTrue(obj != null);
//test convertMacAddressToByteArray6
MacAddress macAddress = mock(MacAddress.class);
Method method1 = class1.getDeclaredMethod("convertMacAddressToByteArray6",new Class[]{MacAddress.class});
method1.setAccessible(true);
when(macAddress.getValue()).thenReturn(new String("2001:da8:215:3f0:847a:4267:b2a3:892f"));
Object obj1 = method1.invoke(flowUtils,macAddress);
}
这是控制台报错:
Results :
Tests in error:
FlowUtilsTest.testPrivateMethod:180 >> InvocationTarget
Tests run: 31, Failures: 0, Errors: 1, Skipped: 0
【 在 nuanyangyang 的大作中提到: 】
:
: 我这个程序没有什么问题。如果可能的话,你可以贴更详细的代码,以及错误提示,我帮你看看。
: [code=java]
: ...................
其中第一个方法没有出错,测第二个(参数为MacAddress的方法出错,macaddress是yang文件编译生成的class)
【 在 nuanyangyang 的大作中提到: 】
:
: 我这个程序没有什么问题。如果可能的话,你可以贴更详细的代码,以及错误提示,我帮你看看。
: [code=java]
: ...................
暖神, 谢谢你啦 你说的那个是没错的,我刚刚ipprefix写错了.... 现在没问题了,谢谢你哈!
【 在 nuanyangyang 的大作中提到: 】
:
: 我这个程序没有什么问题。如果可能的话,你可以贴更详细的代码,以及错误提示,我帮你看看。
: [code=java]
: ...................
【 在 menmencqupt 的大作中提到: 】
: 暖神, 谢谢你啦 你说的那个是没错的,我刚刚ipprefix写错了.... 现在没问题了,谢谢你哈!
其实不用new Object[]{blahblah},直接写blahblah就可以了,java1.6开始允许这种新写法。
嗯 好的~[ema3]
【 在 nuanyangyang 的大作中提到: 】
:
: 其实不用new Object[]{blahblah},直接写blahblah就可以了,java1.6开始允许这种新写法。