gpt4 book ai didi

jmockit - 如何使用 JMockit 模拟具有泛型的继承方法

转载 作者:行者123 更新时间:2023-12-04 18:12:19 34 4
gpt4 key购买 nike

我有这个抽象类:

public abstract class Accessor<T extends Id, U extends Value>
{
public U find(T id)
{
// let's say
return getHelper().find(id);
}
}

和一个实现:
public FooAccessor extends Accessor<FooId,Foo>
{
public Helper getHelper
{
// ...
return helper;
}
}

我想模拟对 FooAccessor.find 的调用。
这个:
@MockClass(realClass=FooAccessor.class)
static class MockedFooAccessor
{
public Foo find (FooId id)
{
return new Foo("mocked!");
}
}

将失败并出现此错误:
java.lang.IllegalArgumentException: Matching real methods not found for the following mocks of MockedFooAccessor:
Foo find (FooId)

我明白为什么......但我不知道我还能怎么做。

注意:是的,我可以模拟 getHelper 方法,得到我想要的;但这更像是一个了解 JMockit 和这个特殊案例的问题。

最佳答案

我发现解决这个问题的唯一方法是使用字段

@Test
public void testMyFooMethodThatCallsFooFind(){
MyChildFooClass childFooClass = new ChildFooClass();
String expectedFooValue = "FakeFooValue";
new NonStrictExpectations(){{
setField(childFooClass, "fieldYouStoreYourFindResultIn", expectedFooValue);
}};

childFooClass.doSomethingThatCallsFind();

// if your method is protected or private you use Deencapsulation class
// instead of calling it directly like above
Deencapsulation.invoke(childFooClass, "nameOfFindMethod", argsIfNeededForFind);
// then to get it back out since you used a field you use Deencapsulation again to pull out the field
String actualFoo = Deencapsulation.getField(childFooClass, "nameOfFieldToRunAssertionsAgainst");

assertEquals(expectedFooValue ,actualFoo);

}

childFooClass 不需要被模拟,也不需要模拟父级。

在不了解您的具体案例的情况下,此策略是我利用 jMockit 解封装的最佳方式,可以在不牺牲可见性的情况下测试很多东西。我知道这不能回答直接的问题,但我觉得你应该从中得到一些东西。随意投反对票并批评我社区。

关于jmockit - 如何使用 JMockit 模拟具有泛型的继承方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12372267/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com