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方法是否正确地调用绑定了正确的参数。然而,重构以使其公开,还不确定。