当我运行测试时,我正在使用Mockito库进行Java测试并在Mockito中获取错误。 (我正在使用NetBeans IDE,如果相关的话)。例如,我有一个名为Animal的类,我正在尝试执行以下简单测试:
@Test
public void mokito_test(){
Animal mockAnimal = mock(Animal.class);
Animal testAnimal2 = mockAnimal;
assertTrue(mockAnimal.equals(testAnimal2));
}
此测试给出以下错误:
mokito_test caused an ERROR (at org.mockito.internal.creation.jmock.ClassImposterizer.<init>(ClassImposterizer.java:37))
at org.mockito.internal.creation.jmock.ClassImposterizer.<init>(ClassImposterizer.java:37)
at org.mockito.internal.util.CreationValidator.validateType(CreationValidator.java:14)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33)
...etc.
(还有11个错误,包括java.net,java.security,java.lang和sun.misc。)
但是,如果我使用真实对象而不是模拟对象执行此测试,则测试成功:
@Test
public void animal_test(){
Animal testAnimal1 = new Animal("bear");
Animal testAnimal2 = new Animal("bear");
assertTrue(testAnimal1.equals(testAnimal2));
}
此测试成功。
我已将Mockito jar文件(mockito-core-1.8.0.jar)下载到我的项目目录中,然后引用此特定项目的测试库中jar文件的相对路径。我之前从未使用过Mockito,所以我怀疑我的错误与我的系统配置有关。任何帮助将不胜感激!谢谢!
答案 0 :(得分:3)
Mockito对objenesis
和hamcrest
库有一些外部依赖关系,第37行尝试从objensis
库构建对象。
答案 1 :(得分:0)
你是否正在使用带有junit测试的mockito ..我不确定你要测试的是什么.. 添加所需的jar文件(mockito-all jar)后,创建一个这样的测试。由于您使用的是注释,因此可以使用@Mock创建模拟对象
@RunWith(MockitoJUnitRunner.class)
public class AnimalTest {
@Mock
private Animal mockAnimal;
@Test
public void mokito_test(){
when(mockAnimal.toString()).thenReturn("Some String");
String toStringResult = mockAnimal.toString();
//verify(mockAnimal).toString(); -- to verify toString() method called once on the mock
assertTrue("Some String".equals(toStringResult);
}
}
如果您的Animal类使用Object C方法b,那么您将模拟对象C的方法,如上所示。
答案 2 :(得分:0)
您正在运行的测试没有测试任何内容,也没有尝试验证任何交互。模拟在面向对象的系统中用于指定对象如何相互交互 - 因此要检查一个对象是否告诉其他对象执行操作。
它们不应用于测试计算或状态值对象的更改。在这些类型的测试中使用模拟会导致脆弱的测试,因为您只是复制了方法的下划线实现。
因此,应始终使用真实对象测试值对象上的方法(如equals,hashCode,toString)。
这个过程在一本名为“增长的面向对象软件,测试指导”的书中得到了很好的描述。