大多数模拟框架确实依赖于某种形式的 IOC。这是因为 IOC 实际上是一种很好的做法。除了测试之外,假设您有一个查找数据库连接(而不是注入它)的类,现在数据库连接的类发生了变化。您不必重新编译代码 - 您应该能够更改注入的依赖项。从测试的角度来看,你可以做同样的事情,注入一个模拟数据库服务。
为了更多地了解您的问题。我将专注于逐步重构为注入而不是硬编码的查找框架。从大件开始,例如数据库和其他 3rd 方服务。当您重构它们时,您可以使用任何模拟框架(我使用过 EasyMock 并且我喜欢它,但还有其他的 - JMock、Mockito)。这些框架不需要包装类,但通常依赖于代理对象。当你创建一个模拟时,你实际上是在创建一个代理(它是你模拟的类类型的一个实例)。
字节码操作(例如,面向方面,如 Typemock 所使用的)可能很危险,严重依赖。通常,您可能还有其他工具也可以操作字节码(代码覆盖工具经常这样做),并且多个字节码操作可能会导致意外行为。
最后,您可以查看 Groovy 之类的语言。Groovy 与 Java 配合得很好(它可以编译为字节码),并且在语言中内置了 mock。一些使用 Groovy 搜索模拟对象的 Google 搜索应该会返回一些不错的结果。