1

我有类文件有这样的方法:

public boolean validate(String str) {}

这个验证方法中有很多代码,但我只想让它总是返回真或假。有人可以指出如何修改类文件来实现这一点吗?

4

4 回答 4

5

RULE override rtn CLASS Foo METHOD validate IF true DO RETURN true ENDRULE

http://www.jboss.org/byteman

于 2011-05-30T06:22:21.883 回答
2

您是否尝试对此代码进行单元测试并在不关心条件的情况下强制给出答案?如果是这种情况,那么您正在寻找“模拟”框架。在 Java 中,我能想到MockitoEasyMock

相关地,您可以使用PowerMock(与上述任一 Mocking 框架协同工作)来动态更改类(例如final类/方法、static方法,甚至private类的片段)。PowerMock 实际上可以在必要时更改字节码。检查其类加载文件夹。

我从来没有考虑过,但可能可以在非测试代码中使用它们中的任何一个,但它们可能需要调整以避免 JUnit 依赖项(例如 JUnit Runner)。再说一次,我从来没有想过它,所以我从来没有考虑过它的含义。

至少,您可能可以通过 PowerMockito 查看它们如何更改字节码。

如果您只想进行单元测试,那么它非常容易,您可能不需要担心字节码。

public class SomeClass {
    public boolean validate(String s) {
        // tons of logic
    }
}

测试(使用带有 JUnit 4 的 Mockito(删除@TestJUnit 3 的属性)):

private final MyClassBeingTested testClass = new MyClassBeingTested();

@Test
public void testMyCodeWithSomeClass() {
    SomeClass some = mock(SomeClass.class);

    when(some.validate(anyString())).thenReturn(eq(true));

    // whenever it uses "some.validate()", with any
    //  string, then it will return true
    testClass.useSomeClass(some);

    // assert whatever conditions you want

    // if you care to ensure that it called validate:
    //  note: times(1) is implied if not supplied, but times(0), times(2), etc.
    //  could be used ("never()" exists as a synonym for times(0))
    verify(some, times(1)).validate(anyString());
}
于 2011-05-29T08:28:35.480 回答
1

根据提供的方法签名,它只能返回 true 或 false。
您能否创建一个包装类,将调用委托给原始文件并覆盖您需要的行为,而不是尝试操作字节码?

于 2011-05-29T06:12:02.200 回答
1

修改字节码最简单的方法是反编译类或获取源代码的副本。更改代码并编译它。将新版本较早地放在类路径中或替换 jar 中的原始版本。这样你就改变了方法。

您可以在运行时更改它,但这要困难 100 倍。;)

于 2011-05-29T08:06:07.050 回答