2017-08-09 25 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給我的基本思路爲此解決方案。