使用Mockito's examples page中最基本的示例,我能够在JUnit中成功运行。
但是,当我在Spock中运行相同的测试时,它失败了。
JUnit/版本(这个通过了):
import org.junit.Test;
import java.util.List;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
public class SimpleJunitTest
{
@Test
public void basicMockTest()
{
List mockedList = mock(List.class);
//using mock object
mockedList.add("one");
mockedList.clear();
//verification
verify(mockedList).add("one");
verify(mockedList).clear();
}
}
Groovy/版本(失败):
import static org.mockito.Mockito.mock
import static org.mockito.Mockito.verify
class SimpleSpockTest extends spock.lang.Specification
{
def "Basic Mock Test"()
{
given:
//mock creation
List mockedList = mock(List.class);
when:
//using mock object
mockedList.add("one");
mockedList.clear();
then:
//verification
verify(mockedList).add("one");
verify(mockedList).clear();
}
}
以下是当Spock测试失败时我得到的错误:
Condition not satisfied:
verify(mockedList).add("one")
| | |
| | false
| $java.util.List$$EnhancerByMockitoWithCGLIB$$172e393a@613043d2 (renderer threw
NullPointerException)
$java.util.List$$EnhancerByMockitoWithCGLIB$$172e393a@613043d2 (renderer threw
NullPointerException)
at SimpleSpockTest.Basic Mock Test(SimpleSpockTest.groovy:25)
有什么想法或建议吗?我真的很喜欢Spock和Mockito,我希望他们能很好地合作。非常感谢!
发布于 2013-05-22 04:00:19
粗略地说,then-block只能包含布尔表达式形式的断言。Mockito验证表达式不适合这个约定,因为当它通过时将返回一个假值(null
,false
,0
),这被Spock解释为一个失败的断言。
要解决这个问题,您可以编写一个辅助方法来包装验证表达式并始终返回true
,或者您可以使用Spock的内置模拟框架来代替Mockito。
发布于 2020-12-04 01:06:27
我有一个用例,要求PowerMockito模拟Java类中的最终方法( Spock模拟将不起作用),但还需要验证它们是否被调用,因为最终方法是构建器风格的,并返回"this",这使得即使模拟的调用没有被调用,测试也会通过。
我的解决方案是将"|| true“附加到我的验证调用中,如下所示:
given:
when(myMock.setSomething("xyzzy")).thenReturn(myMock)
when:
def result = objectBeingTested.isExecutedWith("xyzzy")
then:
result == expectedResult
Mockito.verify(myMock).setSomething("xyzzy") || true // this passes
Mockito.verify(myMock).setSomething("wrongValue") || true // this FAILS appropriately
https://stackoverflow.com/questions/16678126
复制相似问题