Java 即使引发了预期的异常,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

我有一个junit测试,它不能像预期的那样工作

@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;
    }

}