Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JMockit在第二次测试调用时返回实类而不是模拟对象_Java_Unit Testing_Jmockit - Fatal编程技术网

Java JMockit在第二次测试调用时返回实类而不是模拟对象

Java JMockit在第二次测试调用时返回实类而不是模拟对象,java,unit-testing,jmockit,Java,Unit Testing,Jmockit,我目前正在使用JUnit5和JMockit1.49提高遗留代码的代码覆盖率 我有一个测试类,它有两种不同的测试方法: 类CodatixBookmarkControllerTest{ @测试 CodatixBookmarkController书签控制器; @嘲弄 服务定位器; @嘲弄 HttpServletRequestReq; @嘲弄 httpservletres; @嘲弄 dms文件夹; @试验 void testShowBookmarksNoExistingBookmarksFolder()

我目前正在使用JUnit5和JMockit1.49提高遗留代码的代码覆盖率

我有一个测试类,它有两种不同的测试方法:

类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

非常感谢您的帮助,谢谢