我对这个非常着迷。我有一些基于Spring的JUnit4运行的验收测试。现在我还想添加单元测试。为了让它们更快,我跳过上下文,用PowerMock注入Mocks。然而,突然的反思再也起不了作用了。
public class TestSomething {
@Test
public void nothingWrongWithThis() {
Class<?> type = Client.class;
type.getDeclaredMethods();
}
}
第二行将像除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)
也不会改变任何事情。
有什么想法吗?
谢谢!
附言:从现在开始,我将在外地呆一天,所以我会在大约35小时后阅读任何答案。
编辑
刚刚弄清楚发生了什么:我在调试器中启动并打开了Client.class.declaredMethods
,即null
。当我运行getDeclaredMethods()
时,它会得到它们。所以一开始看起来好像所有的东西都是空的,这让我很困惑,但调试器没有在所有字段上运行get...()
,最初只剩下null
如果我使用spring上下文,它将加载所有bean(Client
是@Entity
),并用软引用填充所有反射字段,就像我对所有反射字段调用get..()
一样。
刚刚发现:缺少在调试器中使用反射时如何工作的知识;)检查我的编辑。。。将此标记为已回答,但保留为参考。