2017-08-09 22 views
0

问题是“简单”。与Mockito.verify(myInstance, times(3))类似,在任何测试框架中都有计算对象实例的东西吗?Java测试:如何计算对象实例化?

我的意思是:

class Obj { 
    public void a() { 
     new Obj(); 
    } 
} 

@Test 
@PrepareInstantiationCounter(Obj.class) // <-- this does not exists. I need it 
...test... { 
    new Obj().a(); 
    InstantiationCounters.countOf(Obj.class) // This also does not exists, I would expect 2 
} 

我希望我的例子有助于给你的什么我试图获得一个想法。

+2

随着PowerMockito你可以存根/间谍构造函数。 https://stackoverflow.com/questions/13364406/mockito-mock-a-constructor-with-parameter –

回答

0

不幸的是,我不知道任何提供此功能的框架。 但是,您可以做的是修改或覆盖给定类的构造函数和finalize方法,并将计数器存储在静态变量中。

public class MyClass { 
    public static int instances = 0; 

    public MyClass(/*Args*/){ 
     ... 
     MyClass.instances++; 
    } 

    @Override 
    protected void finalize() { 
     super.finalize(); 
     --MyClass.instances; 
    } 

} 

希望这会有所帮助。

+1

@Ordiel https://stackoverflow.com/a/1908870/7591918还检查了这一点,我认为第3和第4部分会对你特别有意思。 – Wep0n

+0

是的,我想过这个,但它对我无法控制的班级没有帮助:/ – Ordiel

+0

查看我的评论,你有最佳时机;) – Wep0n

0

你可以在类中定义静态字段并在类的构造函数这样增加它:

class MyClass 
{ 
    public static void main (String[] args) 
    { 
     obj test=new obj(); 
     System.out.print(obj.counter); //the result will be 1 
    } 
} 

class obj{ 
    static int counter=0; 
    obj(){ 
     counter++; 
    } 
} 

,或者如果你想在柜台是私有的,你可以使用一个公共的方法来恢复它:

class MyClass 
{ 
    public static void main (String[] args) 
    { 
     obj test=new obj(); 
     System.out.print(obj.numberOfInstances()); //the result will be 1 
    } 
} 

class obj{ 
    private static int counter=0; 
    obj(){ 
     counter++; 
    } 
    public static int numberOfInstances(){ 
     return counter; 
    } 
} 
0

您可以使用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给我的基本思路为此解决方案。