1

スーパークラスがあるとしましょう

class SuperClass {
    SuperClass(Foo foo) {
        this.foo = foo;
    }

    SuperClass() {
        this.foo = new DefaultFoo();
    }
}

そして、サブクラスがあります

class SubClass extends SuperClass {
     SubClass(Foo foo) {
        super(foo);
    }
}

テスト対象のクラスはSubClassです。SubClass'コンストラクターが実際にスーパークラスの空でないコンストラクターを呼び出していることを確認したいと思います。これを達成する方法はありますか?

4

4 に答える 4

3

スーパーコンストラクターの副作用を介してこれをテストします。たとえば、特定のフィールドを設定したり、動作を変更したりしますか?

クラスの実装は、実際にはテストから保護する必要があることに注意してください。したがって、構築されたエンティティにどのように影響するかにのみ関心があります。それ以外の場合、クラス階層をリファクタリングする場合は、テストを変更する必要がありますが、回帰を実行するには、テストを同じままにする必要があります。

于 2012-10-10T08:14:01.493 に答える
1

単体テストからそれを確認するには、Fooインスタンスを作成してSubClassコンストラクターに渡しinstance.getFoo()、まったく同じ参照が返されるかどうかを確認します。

于 2012-10-10T08:16:28.310 に答える
1

これは、jmockit( http://jmockit.googlecode.com)でスーパークラスをモックすることで可能になるはずです。これが例です

(from:https ://groups.google.com/forum/?fromgroups=#!topic/jmockit-users/O-w9VJm4xOc )

public class TestClassUnderTest { 

     public class ClassUnderTest extends BaseClassForClassUnderTest 
     { 
        public ClassUnderTest(ISomeInterface si) 
        { 
           super(si); 
         } 
         //... 
      } 
@Test 
public void testSuperConstructorCall() 
{ 
    final ISomeInterface si = new ISomeInterface() 
    { 
    }; 

    Mockit.setUpMock(BaseClassForClassUnderTest.class, new Object() { 
        @Mock 
        public void $init(ISomeInterface si_param) 
        { 
            assertNotNull(si_param); 
            assertTrue(si_param == si); 
        } 
    }); 

    ClassUnderTest cut = new ClassUnderTest(si); 
} 

}

于 2012-10-10T08:18:00.100 に答える
0

スーパークラスにブールフィールドを配置し、空でないコンストラクター内で「true」に設定して、空でないコンストラクターが呼び出されたときに「true」にすることができます。対応するオブジェクトのブールインスタンスフィールドのステータスをチェックして、どのコンストラクタが呼び出されたかを確認します。

于 2012-10-10T08:27:29.850 に答える