Java 即使引发了预期的异常,junit测试也会失败
我有一个junit测试,它不能像预期的那样工作Java 即使引发了预期的异常,junit测试也会失败,java,exception,testing,junit4,Java,Exception,Testing,Junit4,我有一个junit测试,它不能像预期的那样工作 @Test(expected = NoProviderAvailableException.class) public void testNoProviderAvailableException() throws Exception { List<String> nodeSvc = new ArrayList<>(); nodeSvc.add("addition"); NodeManifest n
@Test(expected = NoProviderAvailableException.class)
public void testNoProviderAvailableException() throws Exception {
List<String> nodeSvc = new ArrayList<>();
nodeSvc.add("addition");
NodeManifest node = new NodeManifest("localhost", nodeSvc);
ArithmeticServer arithmeticServer = new ArithmeticServer(managementClient.registerNode(node));
arithmeticServer.start();
OperationDispatcher dispatcher = new OperationDispatcher(managementClient);
//Thread.sleep(4);
try {
dispatcher.executeOperation("subtraction", 1, 2);
} finally {
arithmeticServer.stop();
}
}
测试抛出预期的异常。显然,这不是解决问题的可靠方法,所以我想知道问题出在哪里
编辑:以下是操作Dispatcher的代码:
public class OperationDispatcher {
private static Random random = new Random(10);
public OperationDispatcher(ManagementService.Client managementClient) {
this.managementClient = managementClient;
}
private ManagementService.Client managementClient;
private ArithmeticService.Client arithmeticClient;
public long executeOperation(String opName, int num1, int num2) throws TException, NoProviderAvailableException {
ServiceProvider provider = null;
List<ServiceProvider> providers = managementClient.getProvidersForService(opName);
long result = 0;
if (providers.isEmpty())
throw new NoProviderAvailableException();
else {
provider = providers.get(random.nextInt(providers.size()));
TTransport arithmeticTransport = new TSocket(provider.getHostName(), provider.getPort());
TProtocol arithmeticProtocol = new TBinaryProtocol(arithmeticTransport);
arithmeticClient = new ArithmeticService.Client(arithmeticProtocol);
arithmeticTransport.open();
switch(opName) {
case "addition":
result = arithmeticClient.add(num1, num2);
break;
case "multiplication":
result = arithmeticClient.multiply(num1, num2);
break;
case "subtraction":
result = arithmeticClient.substract(num1, num2);
break;
case "division":
result = arithmeticClient.divide(num1, num2);
break;
}
arithmeticTransport.close();
}
return result;
}
}
edit2:这是堆栈跟踪:
[信息]错误堆栈跟踪已打开。[信息]正在扫描
项目。。。[信息][信息]使用生成器
org.apache.maven.lifecycle.internal.builder.singlethrea
线程计数为1的ded.SingleThreadedBuilder[INFO][INFO]
------------------------------------[INFO]构建Apache Thrift示例1.0[INFO]
------------------------------------[信息][信息]-maven资源插件:2.6:资源
默认资源@thrift示例-[警告]使用平台
将Cp1252编码为实际复制过滤后的资源,即生成
依赖平台![信息]跳过不存在的resourceDirectory
c:\Users\Jacob\workspace\thrift Example\src\main\resources[INFO]
[信息]-maven编译器插件:2.5.1:编译默认编译@
thrift exampl e-[INFO]无需编译-所有类都是
日期[INFO][INFO]-maven资源插件:2.6:testResources
默认testResources@th rift示例-[警告]使用平台
将Cp1252编码为实际复制过滤后的资源,即生成
依赖平台![INFO]正在复制2个资源[INFO][INFO]--
maven编译器插件:2.5.1:testCompile默认testCompile@thrif
t-example-[INFO]无需编译-所有类都是最新的
[信息][信息]-maven surefire插件:2.12.4:测试默认测试@
节俭的例子--
[信息]Surefire报告目录:
c:\Users\Jacob\workspace\thrift example\target\surefire报告
----------------------------T T S T S
----------------------------运行it.uniud.atta.thrift.ManagementServiceTest启动管理服务器
港口:7911
正在侦听请求
正在关闭端口7911上的管理服务器
测试运行:1,失败:0,错误:0,跳过:0,经过的时间:0.278
sec运行it.uniud.atta.thrift.OperationDispatchers测试运行:2,
失败:0,错误:1,跳过:0,经过的时间:0.921秒。Thread.sleep对您的程序有何影响?它会在建立管理服务器之后和对方法ExecuteOperation发出任何请求之前增加延迟。我认为只有您自己才能回答这个问题。您正在调用方法ExecuteOperation,并期望它将引发异常。检查您的代码,并尝试理解为什么它不能按预期工作,除非您添加一些延迟。这是某种异步的初始化吗?如果您希望我们帮助您,请发送OperationDispatcherAdded code for OperationDispatcher类的NPE堆栈跟踪和代码。我忘了提到只有maven返回了错误的异常。Eclipse按预期运行测试,但您仍然没有包括NPE的堆栈跟踪。基本上,你在某个地方有一个比赛条件,你有一些信息可以帮助你找到位置,但你没有提供。
public class OperationDispatcher {
private static Random random = new Random(10);
public OperationDispatcher(ManagementService.Client managementClient) {
this.managementClient = managementClient;
}
private ManagementService.Client managementClient;
private ArithmeticService.Client arithmeticClient;
public long executeOperation(String opName, int num1, int num2) throws TException, NoProviderAvailableException {
ServiceProvider provider = null;
List<ServiceProvider> providers = managementClient.getProvidersForService(opName);
long result = 0;
if (providers.isEmpty())
throw new NoProviderAvailableException();
else {
provider = providers.get(random.nextInt(providers.size()));
TTransport arithmeticTransport = new TSocket(provider.getHostName(), provider.getPort());
TProtocol arithmeticProtocol = new TBinaryProtocol(arithmeticTransport);
arithmeticClient = new ArithmeticService.Client(arithmeticProtocol);
arithmeticTransport.open();
switch(opName) {
case "addition":
result = arithmeticClient.add(num1, num2);
break;
case "multiplication":
result = arithmeticClient.multiply(num1, num2);
break;
case "subtraction":
result = arithmeticClient.substract(num1, num2);
break;
case "division":
result = arithmeticClient.divide(num1, num2);
break;
}
arithmeticTransport.close();
}
return result;
}
}