gpt4 book ai didi

java - 模拟 getClass()

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:08:17 24 4
gpt4 key购买 nike

在 Java 中,我想为方法编写测试(简化片段):

public class MyClass {
private static final Set<Class> SOME_SET = new HashSet<Class>(Arrays.asList(Foo.class, Bar.class));

public boolean isValid(Class clazz){
return SOME_SET.contains(clazz);
}
}

下面测试的问题

import static org.mockito.Mockito.when;
import org.mockito.Mockito;

public class MyClassTest {
@Test
public void isValid_Foo_returnsTrue(){
Foo foo = Mockito.mock(Foo.class);
MyClass target = new MyClass();
assertTrue(target.isValid(foo));
}
}

是在模拟类 Foo 上,foo.getClass() 返回带有附加后缀的类名。像这样:

Foo$$EnhancerByMockitoWithCGLIB$$45508b12

由于这个原因,测试失败,因为 SOME_SET.contains(clazz) 返回 false

我无法模拟 Foo 上的 getClass() 方法:

Mockito.when(foo.getClass()).thenReturn(Foo.class);

因为编译器在提示:OngoingStubbing ) extends Foo>> 不适用于参数 (Class )

问题是,如何实现模拟对象的 getClass() 方法返回与真实(非模拟)对象的 getClass() 方法相同的值

最佳答案

Mockito.mock(Foo.class) 产生一个 Foo 类型的对象,但不完全是 Foo 类。在后台它会创建一个匿名代理,它是 Foo 的子类。所以,类(class)不一样。

关于您的 isValid 实现的一个注意事项是:您真的要检查类,还是只检查类的类型(也将接受子类,isAssignableFrom)。如果您检查类型匹配,那么您可以使用模拟类测试您的方法。

此外,您是否认为可以以某种方式处理对象而不是类(例如 isValid(object))?在我看来,在 OOP 中使用对象比 clazz 更好。我建议:

    public boolean isValid(Object obj) {
return SOME_SET.stream().anyMatch(clazz -> clazz.isInstance(obj));
}

关于java - 模拟 getClass(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45409578/

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