Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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 Mockito ArgumentCaptor正在捕获大量重复记录_Java_Multithreading_Junit_Mockito - Fatal编程技术网

Java Mockito ArgumentCaptor正在捕获大量重复记录

Java Mockito ArgumentCaptor正在捕获大量重复记录,java,multithreading,junit,mockito,Java,Multithreading,Junit,Mockito,我尝试使用Mockito和JUnit来测试多线程应用程序。下面是一些有问题的代码: ArgumentCaptor messageCaptor=ArgumentCaptor.forClass(MessageCreator.class); jmsHandler.put(消息); 验证(mockJmsTemplate,Mockito.after(10000).times(4)).send(messageCaptor.capture()); jmsHandler.put(message)行将一个字符串

我尝试使用Mockito和JUnit来测试多线程应用程序。下面是一些有问题的代码:

ArgumentCaptor messageCaptor=ArgumentCaptor.forClass(MessageCreator.class);
jmsHandler.put(消息);
验证(mockJmsTemplate,Mockito.after(10000).times(4)).send(messageCaptor.capture());
jmsHandler.put(message)
行将一个
字符串
放入应用程序,该字符串进入
阻塞队列
,并从多线程部分开始。然后,我等待该方法在接下来的10秒内执行4次并捕获结果

应用程序应该抛出4个
MessageCreator
实例,就我而言,它只是一个包含
字符串的对象,然后我将与预期的输出进行比较。测试期间的日志记录确认正在创建4条消息

但是,当我试图循环使用
ArgumentCaptor
getAllValues()
方法来检查结果时,我注意到
列表
正在重复我的程序的输出数百万次。它应该有4个对象,但上次运行时有6984988个对象

这个数字似乎在某种程度上是可变的,但当我在调试模式下处理测试计时时,它会发生很大的变化。例如,如果我在
jmsHandler
行设置一个断点,跨过该断点,等待应用程序完成处理,甚至在启动
Mockito.verify(…)
步骤之前,
列表
大小骤降到“仅仅”158636个对象

以前有没有其他人遇到过这种问题?如果我能提供更多细节,请告诉我

编辑:下面是一个测试和程序结构的自包含示例:

导入静态org.junit.Assert.assertEquals;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.concurrent.ArrayBlockingQueue;
导入java.util.concurrent.BlockingQueue;
导入javax.jms.jmsception;
导入javax.jms.Message;
导入javax.jms.Session;
导入javax.jms.TextMessage;
导入org.junit.Before;
导入org.junit.Test;
导入org.mockito.ArgumentCaptor;
导入org.mockito.Mock;
导入org.mockito.mockito;
导入org.mockito.MockitoAnnotations;
导入org.springframework.jms.core.JmsTemplate;
导入org.springframework.jms.core.MessageCreator;
公共类多线程测试{
权限管理器中的私有输入;
@嘲弄
私有JmsTemplate mockJmsTemplate;
@以前
公共作废设置(){
initMocks(this);
BlockingQueue=new ArrayBlockingQueue(10);
inputHandler=新输入();
设置队列(队列);
Output outputHandler=新输出();
setQueue(队列);
setJmsTemplate(mockJmsTemplate);
新线程(outputhHandler.start();
}
@试验
公共void testMessage(){
ArgumentCaptor messageCaptor=ArgumentCaptor.forClass(OutputMessageCreator.class);
字符串inMessage=“testMessage”;
List expectedMessages=newarraylist(4);
inputHandler.put(inMessage);
验证(mockJmsTemplate,Mockito.after(10000).times(4)).send(messageCaptor.capture());
System.out.println(“编号:”+messageCaptor.getAllValues().size());
System.out.println(“Equal:+messageCaptor.getAllValues().get(0).equals(messageCaptor.getAllValues().get(0)));
System.out.println(“Equal:+messageCaptor.getAllValues().get(0).equals(messageCaptor.getAllValues().get(1)));
System.out.println(“Equal:+messageCaptor.getAllValues().get(0).equals(messageCaptor.getAllValues().get(2)));
System.out.println(“Equal:+messageCaptor.getAllValues().get(0).equals(messageCaptor.getAllValues().get(3)));
System.out.println(“Equal:+messageCaptor.getAllValues().get(0).equals(messageCaptor.getAllValues().get(4)));
System.out.println(“Equal:+messageCaptor.getAllValues().get(0).equals(messageCaptor.getAllValues().get(5)));
System.out.println(“Equal:+messageCaptor.getAllValues().get(0).equals(messageCaptor.getAllValues().get(6)));
System.out.println(“Equal:+messageCaptor.getAllValues().get(0).equals(messageCaptor.getAllValues().get(7)));
System.out.println(“Equal:+messageCaptor.getAllValues().get(0).equals(messageCaptor.getAllValues().get(8)));
List outMsgs=new ArrayList();
for(OutputMessageCreator创建者:messageCaptor.getAllValues()){
add(creator.getMsg());
}
assertEquals(预期消息、输出消息);
}
私有类输入{
私有阻塞队列;
公共作废put(字符串消息){
试一试{
queue.put(msg);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
公共无效设置队列(阻止队列){
this.queue=队列;
}
}
私有类输出实现可运行{
私有阻塞队列;
私有JmsTemplate JmsTemplate;
专用整数计数器=1;
@凌驾
公开募捐{
while(true){
字符串msg=null;
试一试{
msg=queue.take();
String[]messagesOut=新字符串[4];
对于(int i=0;i<4;i++){
messagesOut[i]=msg+“-”+计数器++;
}
for(字符串messageOut:messagesOut){
System.out.println(messageOut);
发送(新的OutputMessageCreator(messageOut));
《睡眠》(2000年);
}
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
testMessage-1
testMessage-2
testMessage-3
testMessage-4
Number: 5392168
Equal: true
Equal: false
Equal: false
Equal: false
Equal: true
Equal: false
Equal: false
Equal: false
Equal: true