Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 单元测试异步代码和没有外部可见效果的代码_Java_Multithreading_Asynchronous_Testing - Fatal编程技术网

Java 单元测试异步代码和没有外部可见效果的代码

Java 单元测试异步代码和没有外部可见效果的代码,java,multithreading,asynchronous,testing,Java,Multithreading,Asynchronous,Testing,事实上,我有两个问题,虽然有点相关: 我知道单元测试应该测试公共API。但是,如果我有一个关闭套接字并关闭执行器的close方法,那么套接字和执行器都不会暴露给这个API的用户,我应该测试是否这样做,还是只测试该方法执行时没有错误?公共api/行为和impl细节之间的界限在哪里 如果我测试一个执行某些检查的方法,然后在executor服务上对任务进行排队,然后返回一个未来来监视操作进度,那么我是否应该同时测试该方法和该任务,即使该任务本身是一个私有方法或未公开代码?或者我应该只测试public

事实上,我有两个问题,虽然有点相关:

  • 我知道单元测试应该测试公共API。但是,如果我有一个关闭套接字并关闭执行器的close方法,那么套接字和执行器都不会暴露给这个API的用户,我应该测试是否这样做,还是只测试该方法执行时没有错误?公共api/行为和impl细节之间的界限在哪里

  • 如果我测试一个执行某些检查的方法,然后在executor服务上对任务进行排队,然后返回一个未来来监视操作进度,那么我是否应该同时测试该方法和该任务,即使该任务本身是一个私有方法或未公开代码?或者我应该只测试public方法,而通过模拟执行者来安排任务在同一线程中执行吗?在后一种情况下,使用execute()方法将任务提交给执行者这一事实将是一个实现细节,但测试将等待任务完成,以便能够检查该方法及其异步部分是否正常工作


您应该问自己的唯一问题是:我或我的同事是否能够在不频繁执行这些测试的情况下自信地更改代码。如果答案是否定的-编写并维护测试,因为它们提供了价值


考虑到这一点,您可以考虑重构代码,以便“低级别管道”(例如,套接字和线程管理)位于一个单独的模块中,您将其视为模块提供的合同的一部分。我已经使用executor服务进行线程管理,因此它们确实可以被替换/模拟,并且我正在模拟套接字以测试例如,connect方法是否正确地调用绑定了正确的参数。然而,重构以使其公开,还不确定。