Java JMockit在第二次测试调用时返回实类而不是模拟对象
我目前正在使用JUnit5和JMockit1.49提高遗留代码的代码覆盖率 我有一个测试类,它有两种不同的测试方法:Java JMockit在第二次测试调用时返回实类而不是模拟对象,java,unit-testing,jmockit,Java,Unit Testing,Jmockit,我目前正在使用JUnit5和JMockit1.49提高遗留代码的代码覆盖率 我有一个测试类,它有两种不同的测试方法: 类CodatixBookmarkControllerTest{ @测试 CodatixBookmarkController书签控制器; @嘲弄 服务定位器; @嘲弄 HttpServletRequestReq; @嘲弄 httpservletres; @嘲弄 dms文件夹; @试验 void testShowBookmarksNoExistingBookmarksFolder()
类CodatixBookmarkControllerTest{
@测试
CodatixBookmarkController书签控制器;
@嘲弄
服务定位器;
@嘲弄
HttpServletRequestReq;
@嘲弄
httpservletres;
@嘲弄
dms文件夹;
@试验
void testShowBookmarksNoExistingBookmarksFolder()引发IOException{
List folderList=新建LinkedList();
添加(文件夹);
新期望(){
{
folder.listContents();
返回(Collections.EMPTY_LIST、folderList);
folder.getName();
结果=Globals.BOOKMARKS\u文件夹\u名称;
folder.getKey();
result=“key”;
}
};
bookmarkController.showBookmarks(请求、回复);
新的核查(){
{
folder.listContents();
次数=2次;
文件夹。添加((DMSObject)any);
次数=1;
}
};
}
@试验
void testShowBookmarsExistingBookmarksFolder()引发IOException{
List folderList=新建LinkedList();
添加(文件夹);
新期望(){
{
folder.listContents();
结果=文件夹列表;
folder.getName();
结果=Globals.BOOKMARKS\u文件夹\u名称;
folder.getKey();
result=“key”;
}
};
bookmarkController.showBookmarks(请求、回复);
新的核查(){
{
folder.listContents();
次数=1;
文件夹。添加((DMSObject)any);
次数=0;
}
};
}
}
它们几乎相同,只是期望块和验证块不同。当我使用Eclipse运行该类时,在第二个方法上出现以下错误:
java.lang.ClassCastException: java.lang.Class incompatible with com.groiss.dms.DMSFolder
at ch.iflow.codatix.CodatixBookmarkController.getBookmarksFolder(CodatixBookmarkController.java:153)
at ch.iflow.codatix.CodatixBookmarkController.showBookmarks(CodatixBookmarkController.java:85)
at ch.iflow.codatix.CodatixBookmarkControllerTest.testShowBookmarsExistingBookmarksFolder(CodatixBookmarkControllerTest.java:82)
该错误在以下代码段的最后一行被测试的类中抛出:
private dms文件夹getBookmarksFolder(用户){
DMSFolder=null;
DMSFolder rootFolder=dms.getRootFolder(用户);
如错误所示,getRootFolder()
-方法返回类型为Class
的对象,而不是DMSFolder
。但是,dms
是被测试类的类字段,并从模拟的ServiceLocator
实例化,因此根据我的理解,还应该返回DMSFolder
的模拟实例
奇怪的是,如果两个测试方法中只有一个出现在测试类中,那么它们都是成功的,并且测试通过了。每当有两个方法同时出现时,最后一个方法就会因为上述错误而失败
在调试时,我看到在JMockit的类RecordandReplayExecution.java
中,选择了默认返回值而不是模拟实例:
@Nonnull Object[]mockArgs=args==null?NO_args:args;
ExecutionMode ExecutionMode=ExecutionMode.values()[executionModeOrdinal];
如果(不删除(模拟,类描述)){
//如果在调用重写的对象方法(equals,hashCode,
//在记录/验证期间,或在回放期间,但在测试之间,从不同的线程。
返回defaultReturnValue(mock、classDesc、mockDesc、genericSignature、executionMode、mockArgs);
}
有人知道为什么会发生这种情况吗?我是否犯了概念上的错误?或者我是否以错误的方式使用JMockit
非常感谢您的帮助,谢谢