我已经阅读了有关它的文章,但没有任何解决我的问题的方法。我有一个单例类,该类的一个方法在另一个类中被调用。我需要模拟这个方法调用。
Class SingletonClass
{
public static SingletonClass instance()
{
......
return instance;
}
public boolean methodToBeMocked(Object obj)
{
return false;
}
}
另一个类是:
Class A
{
Object doSomeStuff()
{
......
boolean result = SingletonClass.instance.methodToBeMocked();
}
}
我正在测试类中嘲笑methodToBeMocked方法。我尝试使用doReturn代替thenReturn,如其他帖子中所建议的那样,但这没有帮助。
我的测试课是:
Class TestClass{
Class A a = new A();
public void test()
{
SingletonClass singletonClass = mock(SingletonClass.class);
doReturn(true).when(singletonClass).methodToBeMocked(any());
a.doSomeStuff(); // here mocked method returns false
// but if I do this below it returns true !!!!
Object obj = new Object();
boolean result = singletonClass.mockedMethod(obj);
}
}
那么,为什么在调用a.doSomeStuff时我无法理解?这是怎么了?
答案 0 :(得分:0)
问题是静态方法public static SingletonClass instance()
。标准的模仿库不支持静态方法的模仿。我看到了两种解决方案。
添加新方法getSingletonClassInstance()以在测试中进行模拟
Class A {
Object doSomeStuff()
{
......
boolean result = getSingletonClassInstance();
}
SingletonClass getSingletonClassInstance(){
return SingletonClass.instance.methodToBeMocked();
}
}
使用来自模仿库的间谍创建A类实例
导入静态org.mockito.Mockito.spy; .....
Class TestClass{
public void test()
{
Class A a = spy(new A());
SingletonClass singletonClass = mock(SingletonClass.class);
doReturn(true).when(singletonClass).methodToBeMocked(any());
doReturn(singletonClass).when(a).getSingletonClassInstance();
a.doSomeStuff(); // here mocked method returns false
// but if I do this below it returns true !!!!
Object obj = new Object();
boolean result = singletonClass.mockedMethod(obj);
}
}
有关嘲笑spy的更多信息。间谍使用了真实实例并调用了真实方法,但提供了模拟特定方法的功能。不必担心其他方法会继续与实际实现一起使用,只会影响模拟方法。
public static SingletonClass
instance()
答案 1 :(得分:0)
为了他人的利益,我使用以下模拟程序,期望它不会调用someMock.someMethod(),这与when(someMock.someMethod())。doReturn(“ someString”)用法不同。
Mockito.doReturn("someString").when(someMock).someMethod();
我不明白为什么仍然要调用真正的someMethod()。事实证明该方法被指定为 final 。 Mockito无法模拟静态或最终方法。