gpt4 book ai didi

java - Mockito spy 失败,因为无法初始化类成员

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:10:18 26 4
gpt4 key购买 nike

我有以下代码:

public class MyClass() {
private MyObject myObject = getMyObject();
public MyObject getMyObject() {
if (myObject == null) {
myObject = MyStaticClass.createMyObject();
}
return myObject;
}
// heaps more methods
}

public class MyTest() {
private MyClass spyMyClass = spy(new MyClass());
public MyTest() {
doReturn(null).when(spyMyClass).getMyObject();
}
@Test
public void someTest() {
ClassUnderTest c = new ClassUnderTest();
assertTrue(c.someMethod(spyMyClass));
}
}

测试失败,出现错误 Could not initialise class MyStaticClass。这个静态类的原因是初始化了更多在测试期间不可用的其他类对象(例如数据库),我不在乎,因为你可以看到我可以在方法 getMyObject() 时返回 null > 被调用。

但是这个意图也失败了,因为在到达 doReturn(null) 行之前,测试已经在 spy(new MyClass()) 行失败了,其中它调用 getMyObject() 来初始化私有(private)成员 myObject

上述情况的解决方法是使用mock(MyClass.class)而不是spy(new MyClass()),这样私有(private)成员 myObject 没有被初始化,因此没有调用真正的 getMyObject() 方法。

但是这个变通方法让我又头疼了,因为这意味着我将不得不为 MyClass 中的那些堆更多方法做一些配置(甚至只是 doCallRealMethod()) .

问题:是否有另一种解决方案,我仍然可以在 MyClass 的实例上使用 spy ,这样我就可以忘记在这个类中配置这些堆更多的方法,但我可以绕过 无法初始化类 MyStaticClass 错误?

附言我不能简单地使用 Power Mock 来模拟 MyStaticClass,因为我已经在为 MyTest 使用另一个测试运行程序。除非您的答案可以表明同时运行两个测试运行器而不实现结合两者的新混合测试运行器是多么容易。


感谢 Adam,现在我有了一个可以正常工作的代码:

public class MyTest() {
private MyClass spyMyClass = spy(new MyClass() {
@Override
public MyObject getMyObject() {
return null;
}
});
@Test
public void someTest() {
ClassUnderTest c = new ClassUnderTest();
assertTrue(c.someMethod(spyMyClass));
}
}

最佳答案

创建 MyClass 的子类并在 private MyClass spyMyClass = spy(new TestMyClass()); 中使用它:

class TestMyClass extends MyClass {

@Override // fortunately, the original method called in constructor can be overridden (what could be considered bad)
public MyObject getMyObject() {
// something that does not fail the constructor
}

}

一般来说,这是一个潜在的问题原因,因为您在构造函数中调用了非私有(private)、非 final方法。对于测试用例,它可能是可以接受的。

稍稍退后一步,我想看看这个 MyClass 对象的职责是明智的。是不是做的太多了,不好测试,不好交互?这通常会导致“难以模拟”综合症。

关于java - Mockito spy 失败,因为无法初始化类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46555797/

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