私はこれでかなり迷っています。Spring ベースの JUnit4 でいくつかの受け入れテストを実行しています。ここで、単体テストも追加したいと思います。それらを高速にするために、コンテキストをスキップして、PowerMock でモックを注入します。ただし、突然の反射はすべて機能しなくなります。
public class TestSomething {
@Test
public void nothingWrongWithThis() {
Class<?> type = Client.class;
type.getDeclaredMethods();
}
}
2 行目は、getName() を除く型への他のメソッド呼び出しと同様に null を返します。
ただし、コンテキストを使用すると機能します。
@TransactionConfiguration
@ContextConfiguration({ "classpath:dw-product-context-test.xml" })
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
public class TestSomething {
@Test
public void nothingWrongWithThis() {
Class<?> type = Client.class;
type.getDeclaredMethods();
}
}
ここで何が問題なのですか?リフレクションは、ランナーやコンテキストなしで機能するべきではありませんか?
行を追加することすらありません
private Client client = new Client();
何かを変更します(おそらく、ランタイムがクラスを反映できるようにクラスを初期化する必要があると考えました)
ああ、追加
@RunWith(PowerMockRunner.class)
も何も変わりません。
何か案は?
ありがとう!
PS: 今日から 1 日外出するので、35 時間以内に回答を読み上げます。
編集
何が起こっているのかを理解したところです。デバッガーを起動して、Client.class.declaredMethods
どれがnull
. ただし、実行getDeclaredMethods()
するとそれらが取得されます。そのため、最初はすべてが null のように見えて混乱しましたが、デバッガーはget...()
すべてのフィールドで実行されず、null
最初はそれらを残していました
スプリング コンテキストを使用すると、すべての Bean ( Client
is an @Entity
) が読み込まれ、すべてのリフレクション フィールドがソフト参照で埋められget..()
ます。