2017-08-09 8 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ファイルを含めます。私はあなたのJava呼び出しに、次のオプションを追加する必要がありますこのコードを実行するには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)); 
} 

のJUnitを用いて、以下のコード例を書いた:

-Xrunjdwp:transport=dt_socket,address=3001,server=y,suspend=n 

このBeyoundJava articleは私の基本的な考え方を与えましたこの解決策のために。

関連する問題