您可以使用JDI接口来计算对象。它随JDK一起提供。要使用它,请在课程路径中包含tools.jar
文件。我已经写了下面使用JUnit 4
public class MarsRover {
public String toString() {
return "I'm a cool robot";
}
}
private static VirtualMachine vm;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
VirtualMachineManager vmm = Bootstrap.virtualMachineManager();
List<AttachingConnector> acl = vmm.attachingConnectors();
for(AttachingConnector ac: acl) {
if(ac.transport().name().equals("dt_socket")) {
Map<String, Connector.Argument> arg = ac.defaultArguments();
arg.get("port").setValue("3001");
arg.get("timeout").setValue("30");
vm = ac.attach(arg);
}
}
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
vm.dispose();
}
public static long[] getObjectCount(Class<?> c) {
return vm.instanceCounts(vm.classesByName(c.getName()));
}
@Test
public void test() {
final long[] objectCount;
final List<MarsRover> mrArray = Arrays.asList(new MarsRover(), new MarsRover(), new MarsRover());
objectCount = getObjectCount(MarsRover.class);
assertThat(objectCount.length, is(1));
assertThat(objectCount[0], is(3L));
}
要运行该代码,你需要将下面的选项添加到您的Java调用代码示例:
-Xrunjdwp:transport=dt_socket,address=3001,server=y,suspend=n
这BeyoundJava article给我的基本思路为此解决方案。
随着PowerMockito你可以存根/间谍构造函数。 https://stackoverflow.com/questions/13364406/mockito-mock-a-constructor-with-parameter –