[10/7/06 4:00編集されたサンプルコード] データベースに触れることなく(TestNGでJMockItを使用して)いくつかのコードをテストしようとしていますが、と呼ばれる。ここでは単純化の設定です:JMockIt Mockedメソッドがモックされていない
class DBRow {
public DBRow() { }
public DBRow(Object obj) {
initialize(obj);
}
public void insert() {
actuallyAddRowToDatabase();
}
}
class MyObject extends DBRow {
MyObject(Object obj) {
super(obj);
}
public void insert(Object obj) {
doSomething(obj);
insert();
}
}
class Factory {
static MyObject createObject(Object obj1, Object obj2) {
MyObject newObj = new MyObject(obj1);
newObj.insert(obj2);
return newObj;
}
}
は、私は、実際のデータベースに挿入を防止するために挿入操作を模擬したかったので、私はこのような何か試してみました:
@Test
public void testCreation() {
new Expectations(MyObject.class) {
MyObject mock = new MyObject(null) {
@Mock
public void insert(Object obj) { }
};
{
new MyObject(anyString); result = mock;
}};
MyObject test = Factory.createObject("something", "something else");
}
をしかし、本当のinsert(Object)
があることが表示されますまだ呼び出されています。私はクラスが嘲笑されているので、すべてのインスタンスが嘲笑されるように指定していますよね?そして、私は挿入メソッドを嘲笑すべきだと指定しています。だから、なぜ実際のメソッドが呼び出されるのでしょうか?
上記にも2番目の問題があります。上記のようにExpectationsブロック内にモッククラスを定義すると、Row(Object)
の代わりにRow()
コンストラクターだけが呼び出され、そのオブジェクトが正しく初期化されていないようです。私はこれを@BeforeTest
メソッドに移動し、そのクラスをインスタンス化することでこれを修正しました。ここではそれは次のようになります。
private MyObject mock;
@BeforeTest
public void beforeTest() {
new MockUp<MyObject>() {
@Mock
public void insert(Object obj) { }
};
mock = new MyObject("something");
}
@Test
public void testCreation() {
new Expectations(MyObject.class) {{
new MyObject(anyString); result = mock;
}};
MyObject test = Factory.createObject("something", "something else");
}
だから、これは呼び出されるべき正しいコンストラクタを取得しているようだが、まだinsert()
が同様に呼び出されているようです。どんな洞察?あなたはすなわちfucntion private MyObject mock;
が、実際のオブジェクトtest
呼び出すために嘲笑オブジェクトを使用していない
testStuff()
は問題ありません。実際、私はそれを私の例から削除します。問題は建設中のinsert()
です。うまくいけば私の例を編集するつもりです。しかし、 "すべてのインスタンスは自動的に嘲笑されません"と書かれていますが、 "Classオブジェクトが[Expectationsコンストラクタで指定されている場合] ...指定されたクラスのすべてのインスタンスは、 "あなたの声明を明確にすることはできますか? – Didjit引用した文書を参照してください。「期待」は、模擬的なインスタンスに対する呼び出しの記録段階であることを理解する。それは嘲笑されたオブジェクト作成段階ではありません。 '新しいMockUp'または' Mock'と 'jectn'によって作成されたモックされたオブジェクト –
また、あなたのコードを読むのが非常に混乱します。あなたは 'MyObject'定義に' MyObject(Object obj) 'というコンストラクタしかありませんが、テストコードでは' new MyObject( "something"、 "something else"); '私は何を探しているのか分かりませんで。実際のメソッドが呼び出されている場合は、メソッドを偽のメソッドではなく実際のオブジェクトで呼び出す場合です。 –